1、新建一个C#-Windows-类库(用于创建C#类库(.dll)的项目)类型的工程

2、对于普通C++函数

XXXX_API void cppFun(int i);

在cs代码中添加

[DllImport("c++xxxx.dll")]

public static extern void cppFun(int i);

3、对于C++中的结构体,因为C++中结构体默认访问控制为public,而C#中结构体默认为private,所以要显示指定一下

typedef struct {
     char sDVRIP[16]; /* DVR IP地址 */
     char sDVRIPMask[16]; /* DVR IP地址掩码 */
     DWORD dwNetInterface; /* 10M/100M自适应,索引 */
     WORD wDVRPort; /* 端口号 */
     BYTE byMACAddr[MACADDR_LEN]; /* 服务器的物理地址 */
 }NET_POSA_ETHERNET;

C#对应

public struct NET_POSA_ETHERNET
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string sDVRIP; //DVR IP地址
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string sDVRIPMask; // DVR IP地址掩码
public uint dwNetInterface; //网络接口 1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应
public uint wDVRPort; //端口号
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] byMACAddr; //[MACADDR_LEN]; //PPPoE用户名//服务器的物理地址
}

将string转为IntPtr:IntPtr System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)

将IntPtr转为string:string System.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)

类型对照:

BSTR ---------  StringBuilder

LPCTSTR --------- StringBuilder

LPCWSTR ---------  IntPtr

handle---------IntPtr

hwnd-----------IntPtr

char *----------string

int * -----------ref int

int &-----------ref int

void *----------IntPtr

unsigned char *-----ref byte

Struct需要在C#里重新定义一个Struct

CallBack回调函数需要封装在一个委托里

typedef void(* CallbackResult)(int progress, char *result);
extern"C" _declspec(dllexport)
void subscribe0(char* eventName, CallbackResult callback)
{
callback(, "AAABBB");
} C#
public delegate void CallBack(int progress, string lParam);
[DllImport("deepstream_for_csharp")]
public static extern void subscribe0(string eventName, CallBack func);
CallBack myCallBack = new CallBack(ReportView);
subscribe0("adsm", myCallBack);
public static void ReportView(int progress, string lParam)
{
Debug.Log("AAAAAA");
}
C++:
EXPORTS_U3DDLL
void subscribe(char* eventName,void(*func)(const char*))
{
if (client == )
{
std::cout << "client has not been created!!";
return;
}
const deepstream::SubscriptionId event_sub_id =
client->event.subscribeForUnity(eventName, func);
subEventID[eventName] = event_sub_id;
}

SubscriptionId subscribeForUnity(const std::string &name, std::function<void(const char* data)> callback)
{
Buffer name_buff(name);
Event::SubscribeFn core_callback([callback, this](const Buffer &prefixed_buff) {
const json &data = type_serializer_.prefixed_to_json(prefixed_buff);
const std::string &data_string(data);
callback(data_string.c_str());
});
SubscriptionId subscription_id = client_.event.subscribe(name_buff, core_callback);
return subscription_id;
}

C#:
[DllImport("deepstream_for_csharp")]
public static extern void subscribe(string eventName, SubscribeCallBack callback);
public delegate void SubscribeCallBack(string data);
public static void eventPosCallBack(string data)
{
Debug.Log("pos:" + data+data.Length);
}
subscribe("pos", new SubscribeCallBack(eventPosCallBack));

最新文章

  1. Hadoop 2.6.0 Namenode HA,ResourceManager HA
  2. MVC结构
  3. Binary Tree: Write a function to return count of nodes in binary tree which has only one child.
  4. Azkaban 2.5.0 job type 插件安装
  5. django(五)
  6. BZOJ 4337: BJOI2015 树的同构 树hash
  7. ios中的几种多线程实现
  8. nsstring打印结构体
  9. 微信分享朋友圈监听(PHP)
  10. Cleaning Shifts(POJ 2376 贪心)
  11. 一.把传统服务做成dubbo分布式服务架构的步骤
  12. 关于nginx中不用.htaccess 用在ningx.conf中配置的问题
  13. 关于python单例的常用几种实现方法
  14. &lt;jsp:param&gt;标签给属性赋值时的一个坑
  15. Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法
  16. iText5报表_页眉与页脚
  17. HandlerSocket
  18. Python 常用PEP8规范
  19. Navicat连接mysql报错1251
  20. 【agc003E】Sequential operations on Sequence

热门文章

  1. struts2 Action向JSP传值方式
  2. Tomcat 监控的几种方法
  3. (七)Oracle学习笔记—— 游标
  4. &lt;转&gt;Oracle Stream Replication技术
  5. C# 异或校验算法
  6. java中finalkeyword使用说明
  7. atom搭建markdown环境及问题
  8. Laravel建站03--建立前台文章列表和文章详情
  9. linux一条命令添加一个root级别账户并设置密码
  10. 点滴积累【JS】---JS小功能(JS实现多物体缓冲运动)