最近做項目需要把以前Vc寫的程序整合到VS2005來,用c#寫的,以前VC的動態連接庫寫好了,重寫比較麻煩,讓C#調用VC dll就好了。但碰到了一個問題:VC中作為輸出參數的char*類型的變量應該怎樣申明才能正確輸出數據呢?
一般說來,在VC中一般的輸出參數都為指針或數組的形式,如果是一般類型的指針如整形等,在c#中用ref加上數據變量則可獲得返回值。所以我試著把VC中char*輸出變量在c#中寫成ref string(因為char*在c#中可以寫成string或char[]),但發現這樣寫是不行的。
後來從網上查了些資料,發現char*類型數據作為輸出參數時,在c#中數據類型要寫成StringBuilder。這樣既解決了傳進去的參數問題,又解決了傳出參數的問題。
以下例子是我用C#調用VC dll中的函數的聲明及使用方法:
1.CharSet要使用Ansi,因為Vc默認是Ansi的,而c#是Unicode,兩者不統一會產生亂碼。還有其他DIIImport的其他參數如下,除了EntryPoint,其他三個都是非必要的。
EntryPoint: 指定要調用的 DLL 入口點。默認入口點名稱是托管方法的名稱 。
CharSet: 控制名稱重整和封送 String 參數的方式 (默認是UNICODE)
CallingConvention指示入口點的函數調用約定(默認WINAPI)
SetLastError 指示被調用方在從屬性化方法返回之前是否調用 SetLastError Win32 API 函數 (C#中默認false )
2.結構體的引用傳遞
首先在c#中定義和c++相同的結構體,如果是引用傳遞,在結構體前面加上[In, Out],如:
[DllImport(@"test.dll")]
public static extern int test([In, Out] SLineData[] lndt,ref UInt32 length);
3.如果遇到char**類型的輸出參數也就是指針的指針,或者二維數組或其他更復雜的情況。可以參考以下網頁:
(轉自http://blog.sina.com.cn/s/blog_4c6e822d01017xk9.html)