将 MFC Gui 应用程序包装到 .NET 互操作的 DLL(或其他东西)中
Posted
技术标签:
【中文标题】将 MFC Gui 应用程序包装到 .NET 互操作的 DLL(或其他东西)中【英文标题】:wrapping an MFC Gui app into a DLL(or something else) for .NET interop 【发布时间】:2009-04-15 04:11:05 【问题描述】:听起来是个糟糕的主意?是的,我也是这么想的。不用说我告诉我必须这样做。
情况: 旧的基于 MFC 的 C++ gui 应用程序,它读取大量数据源并将其处理成内部数据结构,然后再将其显示给用户。
问题: 我需要 .NET 中的数据结构,在 XML 中就可以了。
解决方案:
-
在 MFC 应用程序中创建一个函数,将数据结构写入一个大的 XML 字符串(简单)。
dll 导出这个函数(或 COM?)(作为 C++ 或 C 函数还是什么?)
将 MFC GUI 应用程序编译成 dll(如何?)。
???
从 .NET 和 P/Invoke 方法中引用 dll 以获得丰厚的利润。
这是精神错乱吗?是否可以从 GUI MFC 应用程序编译 dll 库而不更改它?这是一个可怕的想法吗?我的替代方案是什么?我很迷茫。
【问题讨论】:
【参考方案1】:我将致力于在 MFC 应用程序中提取特定的业务逻辑代码并将这些内容粘贴到 DLL 中,而不是试图包装整个应用程序。
您可能在这里做了一个错误的假设,即将 MFC 应用程序封装为 DLL 将花费您更少的精力(基本上删除所有 GUI 代码,添加 DLL main 并修改构建过程以生成 DLL),而不是隔离业务逻辑代码并将其放入新的 DLL 项目中。
要将 GUI 封装为 DLL,您需要很好地了解业务逻辑代码的依赖关系以及 GUI 如何使用它,因此您最好将这些内容删掉。
【讨论】:
这也是我会做的——但我不能,因为我只是一个承包商,他们“没有资源”来改变范围以包括重构应用程序。 我认为将 GUI 应用程序链接为 DLL 并将适当的业务逻辑公开为导出函数的资源可能等同于仅提取该业务逻辑并构建新的 DLL。 我同意 Cannonade 的观点。我认为您的方法行不通(尽管我不是这类事情的专家)。但是隔离业务逻辑始终是一个好主意(不仅在这种特殊情况下),而且会给您带来其他优势。【参考方案2】:你能稍微改变一下 MFC 源吗?为什么不添加一些命令行参数来让应用将 XML 输出到标准输出而不是启动 GUI?
在CWinApp::InitInstance
中,您可以通过inheriting CCommandLineInfo
访问命令行参数。
从 .Net 客户端,启动进程并捕获输出。
【讨论】:
以上是关于将 MFC Gui 应用程序包装到 .NET 互操作的 DLL(或其他东西)中的主要内容,如果未能解决你的问题,请参考以下文章
包装 MFC 应用程序(目标移动设备)以创建 dll 以在 c#.NET 中使用以进行互操作