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));

C#封装C++DLL(特别是char*对应的string)的更多相关文章

  1. 将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  2. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  3. 将MFC Grid control封装为DLL的做法及其在DLL中的使用方法

    MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图: 因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到: MFC Grid control2.27源码 ...

  4. unity 代码C#封装为dll

    1  Visual studio软件打开后创建一个项目 2并选择类库类型 3编写简单的代码看看效果(发现会报错),主要是没有添加类库,以及using UnityEngine;引用空间 4添加类库,引用 ...

  5. .net core项目中引用.net framework封装的dll库

    https://blog.csdn.net/sharphou/article/details/80746551   A----------如何安装IIS [Server Hosting]------- ...

  6. C#封装成DLL,并在C#中调用

    一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...

  7. 使用DOS命令将类库封装成dll

    1.Windows键+R.输入cmd进入DOS 2.使用 cd  加路径找到需要封装成dll的类库文件 3.csc /target:library /out:dll的名字.DLL 需要封装的cs文件

  8. VisualStuido中将C#脚本封装打包DLL并调用

    DLL (Dynamic Link Library)---动态链接库 首先了解下使用DLL的优势,程序运行时不用加载所有代码,只有运行到引用时,才从DLL库中取出.并且使用DLL文件还可以减小程序体积 ...

  9. java类封装成dll

    @参考文章1,@参考文章2,@参考文章3 1,建立测试类,注意英文注释部分,用汉语直接编译会乱码 public class Hello { //native method is used for ca ...

随机推荐

  1. remove &#39;^M&#39; in shell script

    近期在windows上编辑一些shell脚本后上传到交换机框体上. 但这些shell脚本无法运行,每一行结尾都有'^M',同一时候框体上又没有dos2unix工具. 这么多脚本也不可能一行一行来改动. ...

  2. mongodb的基本语法(二)

    一.聚集集合查询 1.查询所有记录 db.userInfo.find(); 相当于:select* from userInfo; 默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一 ...

  3. jenkins构建执行shell 所有命令出现command not found

    出现的问题: + rsync -avzP /mnt/workspace/df-admin/ root@192.168.0.153:/home/deploy/deep_fashion_targets/w ...

  4. 解决 TextMate 2 无法安装 Emmet 插件

    本篇文章由:http://xinpure.com/solving-textmate-2-cannot-install-emmet-plugin/ 前端神器 Emmet 插件原名为 ZedCoding ...

  5. elem.attr()无法正确判断checkbox是否选中

    本篇文章由:http://xinpure.com/elem-attr-does-not-correctly-determine-whether-the-checkbox-is-selected/ 关于 ...

  6. Android 自己定义ViewGroup手把手教你实现ArcMenu

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这种UI效果,感觉非常不错,后来知道github上有这 ...

  7. top命令中内存参数

    总结:VIRT 虚拟内存中含有共享库.共享内存.栈.堆,所有已申请的总内存空间.RES  是进程正在使用的内存空间(栈.堆),申请内存后该内存段已被重新赋值.SHR  是共享内存正在使用的空间.SWA ...

  8. springboot admin server常用配置

    Property name Description Default value spring.boot.admin.context-path The context-path prefixes the ...

  9. 汉诺塔(-) java modPow 的用法;

    汉诺塔(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的 ...

  10. tomcat web 修改logo

    第一种: 打开tomcat目录,进入 D:\tomcat\apache-tomcat-7.0.50-1\webapps\ROOT 找到favicon.ico图标 然后替换成自己的 第二种: 由于tom ...