c# - 是否可以将 WPF 窗口打包为 COM 对象

标签 c# c++ wpf com window

我正在尝试使用来自遗留 c++ 非托管 gtk gui 应用程序的 WPF 窗口。是否可以打包 WPF 窗口(包括 xaml 文件)并将其作为常规 com 对象在 c++ gui 应用程序中使用。您是否预见到这种方法有任何问题或问题?

如果可能的话,任何链接或教程或关于如何操作的任何建议都将非常有帮助。 谢谢。

最佳答案

我不知道有任何在线教程可以做到这一点;但这根本不是一个大问题。我试过像这样实现 smth,它对我来说效果很好,下面是我完成的步骤的顺序:

1.将“wpf 用户控件”或“wpf 自定义控件”库添加到您的解决方案中。

2.在新项目中添加一个新的 WPF 窗口类 (Add->Window->...)。然后将你喜欢的任何 wpf 控件添加到你的新窗口中,以检查它是否可以稍后工作

3.向库项目添加新的类和接口(interface),并像下面的例子一样定义它:

[ComVisible(true)]
[Guid("694C1820-04B6-4988-928F-FD858B95C881")]
public interface ITestWPFInterface
{
    [DispId(1)]
    void TestWPF();
}

[ComVisible(true)]
[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123F"),
ClassInterface(ClassInterfaceType.None)]
public class TestWPFInterface : ITestWPFInterface
{
    public void TestWPF()
    {
        Window1 form = new Window1();
        form.Show();
    }
}

4. 使您的程序集 com 可见(在项目属性的“构建”选项卡中注册 COM 互操作 key )并为其分配一个强名称(参见签名选项卡);使用 sn 实用程序生成 key

5.完成上述所有操作后,您将在 debug\release 文件夹中生成一个 your_wpf_lib.tlb 文件

6.在您的 C++ 应用程序中(我猜您有它的源代码并且可以重新编译),添加以下行:

import "C:\full_path_to_your_tlb\your_wpf_lib.tlb"

这应该会在您的 win32 项目调试输出文件夹中生成适当的 tlh 文件。

7.现在您可以从 C++ 代码中调用您的表单了:

TestWPFForms::ITestWPFInterfacePtr comInterface(__uuidof(TestWPFForms::TestWPFInterface));
comInterface->TestWPF();

这应该会显示您的 wpf 表单。


此外,我相信以下链接可能对您有用:

Calling Managed .NET C# COM Objects from Unmanaged C++ Code

WPF and Win32 Interoperation Overview

希望这对你有帮助,问候

关于c# - 是否可以将 WPF 窗口打包为 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2186829/

相关文章:

c# - 将一天添加到模型数据中

c# - 反序列化 JSON 颜色十六进制,不带引号

c++ - 如何获得函数的真值表 (( c + ~d ) * b ) * ~( d + a * e )

wpf - 基于现有样式的 MahApps 设置样式有奇怪的输出

WPF 不呈现 Windows OpenType 字体名称

wpf - 您可以限制 WPF TextBlock 中可见文本的长度吗?

C# 创建一个固定大小的哈希表

c# - 备用 UniqueId 生成技术

c++ - C++ 中 BigInt 类的良好和基本实现

c++ - C++ 中的合并排序 - 程序的奇怪行为