【发布时间】:2010-12-13 12:36:11
【问题描述】:
由于使用了外部库,一些经典的 Windows/C++ 应用程序无法轻松迁移到托管 C++.net。在此类应用程序中使用更新的 GUI 库(如 winforms(甚至 WPF))是否可行,“插入”新控件以替换陈旧的 MFC?
还是真的不值得,而且会花费很多时间?
【问题讨论】:
标签: c++ winforms mfc unmanaged
由于使用了外部库,一些经典的 Windows/C++ 应用程序无法轻松迁移到托管 C++.net。在此类应用程序中使用更新的 GUI 库(如 winforms(甚至 WPF))是否可行,“插入”新控件以替换陈旧的 MFC?
还是真的不值得,而且会花费很多时间?
【问题讨论】:
标签: c++ winforms mfc unmanaged
我发现 C++/CLI 的能力非常。你真的遇到问题了吗?它应该可以直接编译你的 MFC 项目。
但是在同一个线程中混合 WinForms 和 MFC 可能会很困难,因为它们都想运行自己的消息循环。正如 Ray Burns 所建议的那样,WPF 可能与 MFC 更加合作。
【讨论】:
由于 IJW,在非托管代码中使用 WinForms 或 WPF 非常容易。不过,更可能的是,您希望在托管代码中编写新组件,然后将它们嵌入到您的非托管应用程序中。这意味着对于所有新内容,您不必处理内存管理等问题。
WPF 比 WinForms 更强大、更易于使用,所以如果你还没有使用过 WinForms,我肯定会绕过它。
一个考虑因素是您需要利用 WPF 的数据绑定功能。为此,您需要将非托管数据公开为 COM 类或将数据复制到托管代码中。一个简单的方法是在 C++ 中编写访问非托管数据的托管包装类。另一种简单的方法是从托管代码直接访问业务对象层(或数据库)。这完全取决于您当前的数据层是什么样的。
【讨论】:
更好的方法是为您的 UI 创建一个新的 .NET 项目(C# 是您的朋友),并从那里引用您的 C++ DLLS。您不会轻松地将托管代码和非托管代码混合在一个项目中。
见How do I call unmanaged C/C++ code from a C# ASP.NET webpage。它专门讨论一个网页,但代码对于 winForms 或 WPF 应用程序是相同的。
【讨论】:
这并不值得,而且会花费大量时间。
可以让非托管 C++ 代码托管 CLR,并让托管代码运行 UI。
但是,这绝对不是一件小事。
更简单的方法是稍微重写非托管代码,使其可通过 P/Invoke 或 COM 互操作调用,并让托管应用程序(带有 winforms)调用非托管代码。
【讨论】: