C#调用MFC对话框资源托管DLL

Windows 2014年08月04日 ,

最近在做的一个项目需要使用C#来调用之前写好的MFC程序,曾经了解过C++的项目中的托管就是微软用来解决不同语言写成的程序相互调用的问题,于是总体思路就是将原来的工程转化为托管(公共语言运行时支持(/clr))类型,然后使用C#来调用。有了思路就开始干活。

MFC工程转换

将原MFC工程(无公共语言运行时支持)转化为托管类型(公共语言运行时支持(/clr))。

将相应工程->属性->配置属性->常规->公共语言运行时支持下的“无公共语言运行时支持”转化为“公共语言运行时支持(/clr)”即可。

如果编译会出现错误,请新建一个CLR工程,然后对比CLR工程的属性进行设置原工程即可通过编译。

为了使用C#能够调用到MFC资源将原来的接口进行封装,如下,

//http://furzoom.com/c-sharp-mfc-dll/
namespace furzoom
{
	public ref class furzoomRes
	{
	public:
		void static FurzoomSetup(void);
	};
}
  • 1.命名空间不是必须的,这样可以更好的管理类名。
  • 2.成员函数static不是必须的,根据实现需要进行增减。
  • 3.类定义修饰ref是必须的。

这样完成的MFC相关的工程。

C#调用MFC对话框资源托管DLL

  • 1.在C#工程引用中添加上面的dll文件的引用。
  • 2.使用
    furzoom.furzoomRes.furzoomSetup()

    进行调用。

通常到此就完成了调用。

但是由于存在对话框资源,运行会出现如下问题。

Debug Assert Failed

且定位在afxwin2.inl的22行,给出信息太少了,无法确认问题的原因。

修改调用的对话框为MessageBox()正常影响,继续找原因,发现是资源的问题,需要在MFC的调用对话框之前添加如下函数,

AFX_MANAGE_STATE(AfxGetStaticModuleState());

该函数作用MSDN说是在当前作用域内转换模块状态,建议在使用DLL内函数时使用。

那为什么要这样呢?

在MFC的EXE和DLL中都有一个内部的资料句柄,用以识别对话框或者其他资源。当使用其他程序调用这个EXE或者DLL中的函数时,当前的资源句柄仍然指向当前的资源,这就是会产生错误,需要手动切换到调用的EXE或者DLL中的资源。

需要使用上面这个宏来进行切换的原因。

至此,就解决了C#调用MFC对话框资源托管DLL。

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《C#调用MFC对话框资源托管DLL》
日志链接:http://furzoom.com/c-sharp-mfc-dll/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部