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. Sphinx-简介及原理

    1.Sphinx简介 是一款基于SQL的高性能全文检索引擎(还不支持NoSQL), 主要优点有: 1).创建和重建索引迅速 2).大数据量时检索速度较快 3).为很多脚本语言设计了检索API(如PHP ...

  2. 【转】C#播放H264裸码流

    原文地址:https://www.cnblogs.com/cangyue080180/p/5873351.html 要播放H264裸码流,可以分拆为以下三个工作: 1.解码H264裸码流获取YUV数据 ...

  3. (MVC)从客户端中检测到有潜在危险的 Request.Form 值

    在传统的.net Request验证中 ,只需要在WebConfig HttpRuntime节点 加入 RequestValidateMode 属性,值为2.0(此处2.0并非Framework版本) ...

  4. git 这一篇就够80%使用情况了

    转 Git 命令详解及常用命令整理 Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名 ...

  5. MySQL加速查询速度的独门武器:查询缓存

    [导读] 与朋友或同事谈到MySQL查询缓存功能的时候,个人喜欢把查询缓存功能Query Cache比作荔枝, 是非常营养的东西,但是一次性吃太多了,就容易上火而流鼻血,虽然不是特别恰当的比喻,但是有 ...

  6. Atitit .h5文件上传 v3

    Atitit .h5文件上传 v3 1. 上传原理1 2. V3版新特性1 3. Html1 4. Js2 5. uploadV2.js2 6. upServlet & FileUploadS ...

  7. Scala具体解释---------控制结构和函数

    条件表达式: Scala的if else语法结构和Java的一样.只是,Scala的if else表达式有值.这个值就是跟在if或者else后面的表达式的值. 比如: if(x>0) 0 els ...

  8. makefile之findstring函数

    #$(findstring <find>,<in> ) #功能:在字串<in>中查找<find>字串. #返回:如果找到,那么返回<find> ...

  9. 分时段显示不同的提示的网页JS特效代码

    脚本说明: 把如下代码加入body区域中 <SCRIPT> today=new Date(); var day; var date; var hello; var wel; hour=ne ...

  10. linux学习笔记18--文件/chmod/chown/chgrp

    文件类型与扩展名: Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开 ...