C#中使用DllImport調用C++dll

 爲什麼要在C#中調用C++的代碼呢?比如我有一個C#項目要實現某種功能,同時我恰好有一個已經實現了這個功能的C++代碼。我可以用C#重寫一遍,當然如果工程比較大的話,用DllImport來調用C++的dll是一個更好的選擇。

由於C++dll是非託管代碼,我不能直接在C#工程中添加引用(會出錯誤提示)。命名空間System.Runtime.InteropServices提供了DllImport Attribute來動態加載非託管dll。

示例一:

C#

[DllImport("D:/UnitySocket.dll", EntryPoint="Unity_Connect")]

public static extern bool Unity_Connect(string ip, string port);

 

C++

extern C {

public XXX(類似FAR的一個聲明值,忘了明天補上) bool Unity_Connect(string ip, string port);

 

將以上的函數聲明放入一個類中,然後就可以用 類名.Unity_Connect("xxxx", "xx")來調用了。

關於C#與C++內置類型的對照,我的C++分類裏的某篇文章中有詳細說明(當然,是轉帖,(*^__^*) 嘻嘻……)。

 

至於自定義類型,我目前只接觸到struct類型的轉換。也就是在C#中新定義一個struct,逐個字段的類型和大小都要與C++中定義的struct一致。還是寫個例子吧。

示例二:

C++

struct MyDataStream

{

      int length;

      unsigned char   cmd;

      unsigned char* data;

}

C#

struct MyDataStream

{

      int length;

      byte   cmd;

      IntPtr data;
}

看起來很簡單,不過複雜的地方其實在於C#與C++的類型對應。比如說:C++中字符數組是要以'/0'結尾的,C#中的string可沒有結束符。這在有回調函數(C++中聲明CallBack,C#中定義delegate具體函數。C++中會使用這個具體的函數)的情況時要尤其注意。

特別的,IntPtr。一般來說C++中的指針就對應C#中的IntPtr,例外情況就是char*可以對應C#中的string。但是安全的方法,就應該是對應IntPtr,然後使用Marshal類中的一籮筐靜態方法來轉換成C#中的具體類型。命名空間都是System.Runtime.InteropServices。

 

在看上面代碼的時候有沒有人注意到DllImport是用絕對路徑寫的,是否可以用相對路徑呢。我查的結果,是不行滴~但是內置(找不到合適的詞彙形容)dll可以,比如windows的kernel.dll。有以下幾種方法(網上查的):

(待續,明天直接拷文字和代碼上來)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章