新聞中心
最近做項(xiàng)目需要把以前Vc寫的程序整合到VS2005來,用c#寫的,以前VC的動(dòng)態(tài)連接庫寫好了,重寫比較麻煩,讓C#調(diào)用VC dll就好了。但碰到了一個(gè)問題:VC中作為輸出參數(shù)的char*類型的變量應(yīng)該怎樣申明才能正確輸出數(shù)據(jù)呢?

一般說來,在VC中一般的輸出參數(shù)都為指針或數(shù)組的形式,如果是一般類型的指針如整形等,在c#中用ref加上數(shù)據(jù)變量則可獲得返回值。所以我試著把VC中char*輸出變量在c#中寫成ref string(因?yàn)閏har*在c#中可以寫成string或char[]),但發(fā)現(xiàn)這樣寫是不行的。
后來從網(wǎng)上查了些資料,發(fā)現(xiàn)char*類型數(shù)據(jù)作為輸出參數(shù)時(shí),在c#中數(shù)據(jù)類型要寫成StringBuilder。這樣既解決了傳進(jìn)去的參數(shù)問題,又解決了傳出參數(shù)的問題。
以下例子是我用C#調(diào)用VC dll中的函數(shù)的聲明及使用方法:
- using System.Runtime.InteropServices;//使用dll動(dòng)態(tài)庫和API函數(shù)必需
- [DllImport("PmacNc.dll", CharSet = CharSet.Ansi)]
- public static extern int GetResponse(StringBuilder com_response, System.UInt32
- maxchar, System.Char[] sendChar);
- Global.UserDll.GetResponse(com_response, 100, sendchar1);
C#調(diào)用VC dll輸出參數(shù)的注意事項(xiàng)
1.CharSet要使用Ansi,因?yàn)閂c默認(rèn)是Ansi的,而c#是Unicode,兩者不統(tǒng)一會(huì)產(chǎn)生亂碼。還有其他DIIImport的其他參數(shù)如下,除了EntryPoint,其他三個(gè)都是非必要的。
EntryPoint: 指定要調(diào)用的 DLL 入口點(diǎn)。默認(rèn)入口點(diǎn)名稱是托管方法的名稱 。
CharSet: 控制名稱重整和封送 String 參數(shù)的方式 (默認(rèn)是UNICODE)
CallingConvention指示入口點(diǎn)的函數(shù)調(diào)用約定(默認(rèn)WINAPI)
SetLastError 指示被調(diào)用方在從屬性化方法返回之前是否調(diào)用 SetLastError Win32 API 函數(shù) (C#中默認(rèn)false )
2.結(jié)構(gòu)體的引用傳遞
首先在c#中定義和c++相同的結(jié)構(gòu)體,如果是引用傳遞,在結(jié)構(gòu)體前面加上[In, Out],如:
[DllImport(@"test.dll")]
public static extern int test([In, Out] SLineData[] lndt,ref UInt32 length);
3.如果遇到char**類型的輸出參數(shù)也就是指針的指針,或者二維數(shù)組或其他更復(fù)雜的情況??梢詤⒖家韵戮W(wǎng)頁:
http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html?opt=admin
http://www.ixpub.net/viewthread.php?tid=810850
新聞標(biāo)題:C#調(diào)用VCdll輸出參數(shù)
分享地址:http://m.fisionsoft.com.cn/article/djhdgeo.html


咨詢
建站咨詢
