C#封装C++DLL(特别是char*对应的string)
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)的更多相关文章
- 将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- 将MFC Grid control封装为DLL的做法及其在DLL中的使用方法
MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图: 因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到: MFC Grid control2.27源码 ...
- unity 代码C#封装为dll
1 Visual studio软件打开后创建一个项目 2并选择类库类型 3编写简单的代码看看效果(发现会报错),主要是没有添加类库,以及using UnityEngine;引用空间 4添加类库,引用 ...
- .net core项目中引用.net framework封装的dll库
https://blog.csdn.net/sharphou/article/details/80746551 A----------如何安装IIS [Server Hosting]------- ...
- C#封装成DLL,并在C#中调用
一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...
- 使用DOS命令将类库封装成dll
1.Windows键+R.输入cmd进入DOS 2.使用 cd 加路径找到需要封装成dll的类库文件 3.csc /target:library /out:dll的名字.DLL 需要封装的cs文件
- VisualStuido中将C#脚本封装打包DLL并调用
DLL (Dynamic Link Library)---动态链接库 首先了解下使用DLL的优势,程序运行时不用加载所有代码,只有运行到引用时,才从DLL库中取出.并且使用DLL文件还可以减小程序体积 ...
- java类封装成dll
@参考文章1,@参考文章2,@参考文章3 1,建立测试类,注意英文注释部分,用汉语直接编译会乱码 public class Hello { //native method is used for ca ...
随机推荐
- Sphinx-简介及原理
1.Sphinx简介 是一款基于SQL的高性能全文检索引擎(还不支持NoSQL), 主要优点有: 1).创建和重建索引迅速 2).大数据量时检索速度较快 3).为很多脚本语言设计了检索API(如PHP ...
- 【转】C#播放H264裸码流
原文地址:https://www.cnblogs.com/cangyue080180/p/5873351.html 要播放H264裸码流,可以分拆为以下三个工作: 1.解码H264裸码流获取YUV数据 ...
- (MVC)从客户端中检测到有潜在危险的 Request.Form 值
在传统的.net Request验证中 ,只需要在WebConfig HttpRuntime节点 加入 RequestValidateMode 属性,值为2.0(此处2.0并非Framework版本) ...
- git 这一篇就够80%使用情况了
转 Git 命令详解及常用命令整理 Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名 ...
- MySQL加速查询速度的独门武器:查询缓存
[导读] 与朋友或同事谈到MySQL查询缓存功能的时候,个人喜欢把查询缓存功能Query Cache比作荔枝, 是非常营养的东西,但是一次性吃太多了,就容易上火而流鼻血,虽然不是特别恰当的比喻,但是有 ...
- Atitit .h5文件上传 v3
Atitit .h5文件上传 v3 1. 上传原理1 2. V3版新特性1 3. Html1 4. Js2 5. uploadV2.js2 6. upServlet & FileUploadS ...
- Scala具体解释---------控制结构和函数
条件表达式: Scala的if else语法结构和Java的一样.只是,Scala的if else表达式有值.这个值就是跟在if或者else后面的表达式的值. 比如: if(x>0) 0 els ...
- makefile之findstring函数
#$(findstring <find>,<in> ) #功能:在字串<in>中查找<find>字串. #返回:如果找到,那么返回<find> ...
- 分时段显示不同的提示的网页JS特效代码
脚本说明: 把如下代码加入body区域中 <SCRIPT> today=new Date(); var day; var date; var hello; var wel; hour=ne ...
- linux学习笔记18--文件/chmod/chown/chgrp
文件类型与扩展名: Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开 ...