C#調用C++ dll函數,如果返回值為字符串,我們使用string去接收就會報錯,因為C++返回的是char*,是個指針,所以c# 要用 IntPtr 來接收。
C++:
//預編譯的標頭 .h extern "C" _declspec(dllexport) char* demo(const char* params1, const char* params2); //函數體實現 .cpp extern "C" _declspec(dllexport)char* demo(const char* params1, const char* params2) { char* result = params1 + params2; return result; }
C#:
//dll引入 [DllImport("testDll.dll", EntryPoint = "demo")] public static extern IntPtr demo(string params1,string params2); //函數調用 IntPtr tranResult = DllLoad.demo("參數1", "參數2"); Log.println("tranResult===>:" + Marshal.PtrToStringAnsi(tranResult));
通過Marshal.PtrToStringAnsi 將非托管ANSI字符串中第一個空值(空值就是\0)之前的所有字符復制到托管String,將每個 ANSI 字符擴展為Unicode字符,最后就成功返回字符串了。
總結:實踐是檢驗真理的唯一標准。