想在MFC中使用一个C#写的DLL的接口,接口参数为一个委托,求解决办法,谢谢~

zfl939756 2018-01-10 04:36:51
接口定义为:
void SetDrawEvent(DrawEvent drawEvent)

其中参数定义为:
delegate void DrawEvent(object sender, DrawEventArgs args); //DrawEventArgs 继承于 EventArgs。

尝试使用下面的方法:
首先定义一个函数:
void CDLLDebugProjDlg::DrawBitmap(gcroot<System::Object ^> sender ,MyNameSpace::DrawEventArgs args)
{
//TODO
}
然后:
gcroot<MyNameSpace::DrawEvent ^> m_DrawEvent;
m_DrawEvent = new gcroot<MyNameSpace::DrawEvent ^>(DrawBitmap);
再把new 出的m_DrawEvent当参数进行调用:
SetDrawEvent(m_DrawEvent);

结果,编译时,在new 的地方报错:

error C2664: “gcroot<T>::gcroot(T)”: 不能将参数 1 从“void (__clrcall *)(gcroot<T>,MyNameSpace::DrawEventArgs)”转换为“MyNameSpace::DrawEvent ^”
1> with
1> [
1> T=MyNameSpace::DrawEvent ^
1> ]
1> and
1> [
1> T=System::Object ^
1> ]
1> 没有用户定义的转换运算符,或者
1> 没有使该转换得以执行的上下文
1>
1>生成失败。

本人对C# 和 C++/CLI 都只是初学。。。有指点还望细说,谢谢
...全文
694 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfl939756 2018-01-11
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
从来是凭想当然,凭感觉,没用过工具。。。。受教
zfl939756 2018-01-11
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
通过com方式调用c#的dll
还有一个疑问就是,用COM方式,就可以避开接口中需要一个委托做参数的问题了?
赵4老师 2018-01-11
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
zfl939756 2018-01-11
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
通过com方式调用c#的dll
感谢回答 COM也有尝试一下,自己用C#写的COM组件的能使用里面的接口,但想使用里面的一个类,去声明对象,就不知道该怎么弄了。 我自己理解,是不是COM组件只能暴露方法,而不能暴露属性(或者说字段? )。 在网上搜了一下,暂时没找到类似的内容 这种想法是不是有错?
zfl939756 2018-01-11
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
了解一下COM~~~
感谢回答 COM也有尝试一下,自己用C#写的COM组件的能使用里面的接口,但想使用里面的一个类,去声明对象,就不知道该怎么弄了。 我自己理解,是不是COM组件只能暴露方法,而不能暴露属性(或者说字段? )。 在网上搜了一下,暂时没找到类似的内容 这种想法是不是有错?
zfl939756 2018-01-11
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
感谢赵4老师 对后续的备用方法有考虑,包括您说的这种, 但因为生成的文件会比较大,相比原本直接调用多出了写入和读取的操作,担心会影响性能(取得的是一帧一帧的图片数据BMP,需要实时绘制出来), 想没找到好办法直接调用的话,再实测一下看看效果, 另外,就是想知道我贴出来的方法,到底是错在哪里,新接触,多少有点兴趣,有点好奇
oyljerry 2018-01-10
  • 打赏
  • 举报
回复
通过com方式调用c#的dll
Eleven 2018-01-10
  • 打赏
  • 举报
回复
了解一下COM~~~
赵4老师 2018-01-10
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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