【问题标题】:Is Winforms accessible from unmanaged C++?是否可以从非托管 C++ 访问 Winforms?
【发布时间】:2010-12-13 12:36:11
【问题描述】:

由于使用了外部库,一些经典的 Windows/C++ 应用程序无法轻松迁移到托管 C++.net。在此类应用程序中使用更新的 GUI 库(如 winforms(甚至 WPF))是否可行,“插入”新控件以替换陈旧的 MFC?

还是真的不值得,而且会花费很多时间?

【问题讨论】:

    标签: c++ winforms mfc unmanaged


    【解决方案1】:

    我发现 C++/CLI 的能力非常。你真的遇到问题了吗?它应该可以直接编译你的 MFC 项目。

    但是在同一个线程中混合 WinForms 和 MFC 可能会很困难,因为它们都想运行自己的消息循环。正如 Ray Burns 所建议的那样,WPF 可能与 MFC 更加合作。

    【讨论】:

    • 是的。但是,如果您使用 WPF 而不是 WinForms,则消息循环不是问题。这是因为与 WinForms 不同,WPF 不依赖消息循环来处理任何事情,而是使用 WndProc 处理所有事情。所有细节都在 WPF 的 HwndSource 类中为您处理,该类用于与非托管窗口集成,也用于创建顶级 WPF 窗口。
    • 在 MFC 窗口中直接托管 Windows 窗体控件没有问题。 WinForms 控件毕竟是原生窗口的包装器,它们非常无缝地参与整个消息传递过程。
    【解决方案2】:

    由于 IJW,在非托管代码中使用 WinForms 或 WPF 非常容易。不过,更可能的是,您希望在托管代码中编写新组件,然后将它们嵌入到您的非托管应用程序中。这意味着对于所有新内容,您不必处理内存管理等问题。

    WPF 比 WinForms 更强大、更易于使用,所以如果你还没有使用过 WinForms,我肯定会绕过它。

    一个考虑因素是您需要利用 WPF 的数据绑定功能。为此,您需要将非托管数据公开为 COM 类或将数据复制到托管代码中。一个简单的方法是在 C++ 中编写访问非托管数据的托管包装类。另一种简单的方法是从托管代码直接访问业务对象层(或数据库)。这完全取决于您当前的数据层是什么样的。

    【讨论】:

      【解决方案3】:

      更好的方法是为您的 UI 创建一个新的 .NET 项目(C# 是您的朋友),并从那里引用您的 C++ DLLS。您不会轻松地将托管代码和非托管代码混合在一个项目中。

      How do I call unmanaged C/C++ code from a C# ASP.NET webpage。它专门讨论一个网页,但代码对于 winForms 或 WPF 应用程序是相同的。

      【讨论】:

      • 我不同意。我发现混合使用托管和非托管代码比创建单独的项目更容易。通过使用 C++/CLI 编写托管代码,您可以非常轻松地访问非托管数据。比您提到的问题中提到的 P/Invoke 或 COM 容易得多。但这可能是个人喜好问题。
      【解决方案4】:

      这并不值得,而且会花费大量时间。

      可以让非托管 C++ 代码托管 CLR,并让托管代码运行 UI。

      但是,这绝对不是一件小事。

      更简单的方法是稍微重写非托管代码,使其可通过 P/Invoke 或 COM 互操作调用,并让托管应用程序(带有 winforms)调用非托管代码。

      【讨论】:

      • 我不同意。这样的事情可以在几个小时内完成。只需使用 C++/CLR 作为托管和非托管之间的接口。如果您想要代码隐藏,请将您的 XAML 放在单独的 C# 或 VB.NET 项目中。或者只是使用自定义控件模板并使用 C++ 处理一切。这两种解决方案都比 P/Invoke 或 COM 更容易将屏幕添加到现有 MFC 应用程序。
      • 但这不是非托管代码; C++/CLR 编译为 IL,而不是 X86/X64。由于提问者有一堆外部库,他需要一些实际上调用本机代码的东西。外部库通常是二进制的,因此重新编译它们不是一种选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2011-03-04
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多