Unity3D(C#)和c++ dll交互问题

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标记位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 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

你可能感兴趣的:(Unity3D(C#)和c++ dll交互问题)