C#調(diào)用VC dll輸出參數(shù)
最近做項(xiàng)目需要把以前Vc寫(xiě)的程序整合到VS2005來(lái),用c#寫(xiě)的,以前VC的動(dòng)態(tài)連接庫(kù)寫(xiě)好了,重寫(xiě)比較麻煩,讓C#調(diào)用VC dll就好了。但碰到了一個(gè)問(wèn)題:VC中作為輸出參數(shù)的char*類(lèi)型的變量應(yīng)該怎樣申明才能正確輸出數(shù)據(jù)呢?
一般說(shuō)來(lái),在VC中一般的輸出參數(shù)都為指針或數(shù)組的形式,如果是一般類(lèi)型的指針如整形等,在c#中用ref加上數(shù)據(jù)變量則可獲得返回值。所以我試著把VC中char*輸出變量在c#中寫(xiě)成ref string(因?yàn)閏har*在c#中可以寫(xiě)成string或char[]),但發(fā)現(xiàn)這樣寫(xiě)是不行的。
后來(lái)從網(wǎng)上查了些資料,發(fā)現(xiàn)char*類(lèi)型數(shù)據(jù)作為輸出參數(shù)時(shí),在c#中數(shù)據(jù)類(lèi)型要寫(xiě)成StringBuilder。這樣既解決了傳進(jìn)去的參數(shù)問(wèn)題,又解決了傳出參數(shù)的問(wèn)題。
以下例子是我用C#調(diào)用VC dll中的函數(shù)的聲明及使用方法:
- using System.Runtime.InteropServices;//使用dll動(dòng)態(tài)庫(kù)和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)名稱(chēng)是托管方法的名稱(chēng) 。
CharSet: 控制名稱(chēng)重整和封送 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**類(lèi)型的輸出參數(shù)也就是指針的指針,或者二維數(shù)組或其他更復(fù)雜的情況。可以參考以下網(wǎng)頁(yè):
http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html?opt=admin
http://www.ixpub.net/viewthread.php?tid=810850
【編輯推薦】