【发布时间】:2010-10-14 01:39:00
【问题描述】:
我有大量的 MFC/ATL 程序代码,我想在 Windows 窗体应用程序中使用这些代码。什么是“转换”此代码以使其在启用 /clr 的情况下编译并找到基本类的最简单方法,例如CObject、CString、CFile 和模板?
【问题讨论】:
标签: c++ visual-studio-2008 mfc
我有大量的 MFC/ATL 程序代码,我想在 Windows 窗体应用程序中使用这些代码。什么是“转换”此代码以使其在启用 /clr 的情况下编译并找到基本类的最简单方法,例如CObject、CString、CFile 和模板?
【问题讨论】:
标签: c++ visual-studio-2008 mfc
不需要做太多的“转换”,你可以启用 /clr 并编译。会有构建错误,但不会很大。
这是一个不应该轻率做出的决定。一旦你越过了 /clr 的门槛,你就会牺牲一些东西:
构建性能变得更差,尤其是链接。您不能增量链接 C++ /clr 项目。
额外的加载层被添加到您的 .Exe 或 .Dll 中。你必须小心初始化的顺序,尤其是静态的。使用 VS2005 时情况会好很多,但还是有一些小问题。我有一个无法正确卸载的 /clr DLL 项目,我无法弄清楚原因。此类问题的一个症状是您在退出调试时没有获得内存泄漏检测转储。
向项目添加功能时,您可以选择托管或本机实现。如果您选择对项目其他地方本地完成的事情进行管理,您必须选择,我是否要修改旧的实现?
超过托管本机阈值会影响性能和调试。
异常处理变得更加复杂。
与其在整个项目上翻转 /clr 开关,我推荐一种更有针对性的方法。让您的大型图书馆保持原生。创建混合模式 /clr bootstrapper / wrapper。这种“瘦代理”提供了访问本机库的好处,同时保持本机库的稳定性和性能。
如果您的本地库中有对话框(或者更糟糕的是,SDI/MDI 视图,请参阅here),则连接显示器可能会很棘手。但这是值得的。
【讨论】:
VC++.net,如果我没记错的话,有一个新版本的 MFC。将项目转换为 VC.net 项目,然后慢慢将类转换为托管代码。这使您可以慢慢地重新设计所有内容,而不是重新编写所有内容的巨大跳跃。顺便说一句,如果您还没有使用 MVC 设计模式将接口与内部工作分开。
【讨论】: