爲什麼要在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。有以下幾種方法(網上查的):
(待續,明天直接拷文字和代碼上來)