程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#調用VC dll輸出參數

C#調用VC dll輸出參數

編輯:C#入門知識

最近做項目需要把以前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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved