C#中调用C的DLL中的回调函数,想实现消息响应机制
答案:2 悬赏:40 手机版
解决时间 2021-04-06 21:50
- 提问者网友:喧嚣尘世
- 2021-04-06 15:28
C#中调用C的DLL中的回调函数,想实现消息响应机制
最佳答案
- 五星知识达人网友:山有枢
- 2021-04-06 15:52
你这样写代码不是会疯狂输出吗,下面这样就行了,回调函数只有在需要的时候自动触发
下面是按ESC退出,把你的while循环改一下
while(Console.ReadKey(true).Key != ConsoleKey.Escape)
{
}追问谢谢回答,我就是希望做成消息响应的方式,但何时消息会传递过来我并不知道啊,如何才能够知道呢。你写的这个是等待我的键盘输入,而不是真的消息传递过来了啊
下面是按ESC退出,把你的while循环改一下
while(Console.ReadKey(true).Key != ConsoleKey.Escape)
{
}追问谢谢回答,我就是希望做成消息响应的方式,但何时消息会传递过来我并不知道啊,如何才能够知道呢。你写的这个是等待我的键盘输入,而不是真的消息传递过来了啊
全部回答
- 1楼网友:煞尾
- 2021-04-06 16:09
反过来比较容易,因为C#的P/Invoke就是做这个的。但是显然C++没有关于C#代码回调的的实现,因为C++的架构从来也没考虑过还会调用C#(这种情况实在是太少见了,况且也不必要)。如果非要实现可以采用多进程,使用进程间通信。我想到的:
1.模仿linux中的管道(PIPE),产生虚拟文件,而C++阻塞直到文件产生或本身超时。这样可以实现数据交换,既能实现传数据又可以使C++程序及时得到通知。缺点就是IO密集,降低效率。
2.使用TCP通信,监听端口获取消息,这是跨平台程序通信最常用也是最正统的方法。一般是跨操作系统编程常用的,比如windows和linux ubuntu server程序进行交互。你所述情况虽然不算跨操作系统通信,但是也是跨平台了。而且想想就知道C++作为先出现的语言而且是编译型语言,调用C#托管区的函数还要设回调,其难度可想而知。
3.如果你的C++是基于winform的,可以在C#中P/Invoke调用winAPI的SendMessage发送窗体消息从而间接实现回调。
4.自然还有一些更底层的Dirty方法,比如嵌汇编更改上下文程序指针地址。。。不过不适合正统的程序,因为太Dirty啊。。。而且出错概率大。
除此之外,如果不采用多线程通信,C#的反射(reflection)特性可以参考,但是控制权依然在C#。况且C#无从知道C++的内部结构,自然难以直接调用。你想想吧,是不是这个道理~
1.模仿linux中的管道(PIPE),产生虚拟文件,而C++阻塞直到文件产生或本身超时。这样可以实现数据交换,既能实现传数据又可以使C++程序及时得到通知。缺点就是IO密集,降低效率。
2.使用TCP通信,监听端口获取消息,这是跨平台程序通信最常用也是最正统的方法。一般是跨操作系统编程常用的,比如windows和linux ubuntu server程序进行交互。你所述情况虽然不算跨操作系统通信,但是也是跨平台了。而且想想就知道C++作为先出现的语言而且是编译型语言,调用C#托管区的函数还要设回调,其难度可想而知。
3.如果你的C++是基于winform的,可以在C#中P/Invoke调用winAPI的SendMessage发送窗体消息从而间接实现回调。
4.自然还有一些更底层的Dirty方法,比如嵌汇编更改上下文程序指针地址。。。不过不适合正统的程序,因为太Dirty啊。。。而且出错概率大。
除此之外,如果不采用多线程通信,C#的反射(reflection)特性可以参考,但是控制权依然在C#。况且C#无从知道C++的内部结构,自然难以直接调用。你想想吧,是不是这个道理~
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯