国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

Unity3D(C#)和c++ dll交互問題

2019-11-08 18:47:06
字體:
來源:轉載
供稿:網友

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


上一篇:C++中智能指針

下一篇:c++ 變量初始化

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 太保市| 尼木县| 临夏市| 镇平县| 永安市| 西宁市| 崇明县| 清丰县| 蒲城县| 中宁县| 谢通门县| 梨树县| 临泉县| 伊春市| 调兵山市| 宁晋县| 清镇市| 德阳市| 桐庐县| 吐鲁番市| 廊坊市| 阳山县| 保定市| 常州市| 陇川县| 泰顺县| 安远县| 德格县| 行唐县| 星座| 喀什市| 南平市| 霍城县| 峡江县| 嫩江县| 遵化市| 罗田县| 斗六市| 金华市| 彰化县| 紫金县|