C#调用C++API,回调问题

dannys1214 2018-08-16 07:08:07
C++:

//形参为std::function

void Test1(std::function<void(int)> CallBack)

{

CallBack(0);

}

//形参为函数指针

void Test2(void (*CallBack)(int))

{

Test1(CallBack);

}



C#:

//委托

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

public delegate void CallBackDelegate(int X);



//声明DLL函数

[DllImport(DLLPath, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

extern static int Test1(CallBackDelegate CallBack);



[DllImport(DLLPath, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

extern static int Test2(CallBackDelegate CallBack);



C#通过调用Test2来间接调用Test1运行正常

而直接调用Test1,会出错。错误是“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”



Test1、Test2等API编译成DLL,同时给C++和C#工程使用。

我期望API是定义成std::function的,这样当C++来调用API的时候,可以方便的使用带参数捕获的lambda



问题是:

1、为什么C#不能直接调用Test1?

2、C#通过调用Test2来间接调用Test1的方式是否可行?(C++工程直接调用Test1,C#通过调用Test2间接调用Test1,相当于C#调用时加一层马甲)
...全文
86 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2018-08-17
  • 打赏
  • 举报
回复
原则上来说 Test1 的方式不应该是导出的。 哪怕是导出给 C++使用也是不应该的。 因为你无法确定使用者的C++ 的版本和库。 虽然 Test2 不标准,但是还是可以的。 至于 C# 不能使用 Test1,因为对于 C++ 来说 std::function 可以看作是回调函数; 但是对于 C# 来说,他只是 C++ 的一个类而已,而且是一个模板类。不是回调函数(不是函数指针)。 简单的说,Test1 只能在同版本的 C++ 中使用而已。
ztenv 版主 2018-08-17
  • 打赏
  • 举报
回复
void Test1(std::function<void(int)> CallBack):因为test1的参数是std::中的类型,C#中没有;
可以用C#调用Test2()来间接的调用Test1
CyberLogix 2018-08-17
  • 打赏
  • 举报
回复
C#调用C++中间又有CLI的一层来包装,除了COM接口直接调用外不能直接调用,必须先调用托管C++

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧