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

时间:2010-02-02 19:07:02

标签: c# c++ wpf com window

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

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

1 个答案:

答案 0 :(得分:10)

我不知道有任何在线教程这样做;但它根本不应该是一个大问题。我已经尝试过像这样实现smth,它对我来说很好,下面是序列,如果我已经完成了步骤:

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

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

3.添加库项目的新类和接口,并将其定义如下:

[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互操作密钥)并为其指定一个强名称(请参阅签名选项卡);使用sn实用程序生成密钥

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

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

  

进口   “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

希望这有帮助,尊重