C#和C++的交互有多種方法,這里主要說下C#和C接口交互的問題。
C#和C++通過類直接交互的方式,可以參考https://msdn.microsoft.com/en-us/library/ms235281.aspx
首先假如我們有TestC.dll(ios下是.a,Android下是.so),該dll由c++編寫,并導出了__declspec(dllexport) bool Initialize(int GID, int ZID, long UID, const char* clientName, const char* clientVer, void (__stdcall * CB)());這樣的C接口。注意windows下需要加__declspec(dllexport),android和ios請自己變通。
那么在C#代碼中可以如下這樣使用該C接口:
using UnityEngine;using System.Collections;using AOT;using System.Runtime.InteropServices;public class ClassCSharp{ delegate void onInitializeDelegate(); [DllImport("TestC")] PRotected static extern bool Initialize(int GID, int ZID, long UID, string clientName, string clientVer, IntPtr pcb); public void onInitialized(){ Debug.Log("Initialized"); } public void Init(){ onInitializeDelegate initdel = new onInitializeDelegate(onInitialized); Initialize(1, 1, 1, "name", "ver", Marshal.GetFunctionPointerForDelegate(initdel)); }}這里需要注意的幾個問題:
1.C#和C++字符串的轉換問題。這里因為Mono默認字符串為uft8編碼(和微軟不同),所以在C函數收到char*以后記得utf8Decode一下char*指向的字符串,如果有必要的話。
2.如果是C通過回調將char*字符串傳遞給C#的話,請先將字符串轉為utf8編碼的字符,再將char*指針傳給回調函數。mono會自動讀取utf8字符生成string。
全程英文的程序,可以忽略以上兩點。
字符串問題請參考:http://www.mono-project.com/docs/advanced/pinvoke/#strings
Mono on all platforms currently uses UTF-8 encoding for all string marshaling Operations.
關于.NET字符編碼文檔,請參考:https://msdn.microsoft.com/en-us/library/ms404377(v=vs.110).aspx
另外貼下網上找的utf8的編碼方式:
a. 單字節的字符,字節的第一位設為0,對于英語文本,UTF-8碼只占用一個字節,和ASCII碼完全相同;b. n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,后面字節的前兩位都設為10,這n個字節的其余空位填充該字符unicode碼,高位用0補足。這樣就形成了如下的UTF-8標記位:0xxxxxxx110xxxxx 10xxxxxx1110xxxx 10xxxxxx 10xxxxxx11110xxx 10xxxxxx 10xxxxxx 10xxxxxx111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx... ...
3.另外一個需要注意的就是__declspec(dllexport) 、 void (__stdcall * CB)();這三個,__declspec(dllexport) 這個都懂,導出函數用的。回調這個__stdcall必須要加,不然Windows上debug版本會報Run-Time Check Failure #0 - The value of ESP was not properly saved ...,意思就是函數調用方式不對。ios和android平臺的請自行變通和測試下。
關于mono C#和C的交互問題,請參考http://www.mono-project.com/docs/advanced/pinvoke
新聞熱點
疑難解答
圖片精選