c++ 中的 C# COM 互操作

C# COM INTEROP in c++

我正在尝试从 C++ 客户端调用我的 C# dll,到目前为止,我已经完成了所有设置并在我的注册表中(例如,我可以从 power shell 创建和调用它)。

我遇到的问题是我无法从我的 C++ 代码中调用它。

我的 C# 界面:

namespace MyInterop
{
    [Guid("BE507380-1997-4BC0-AF01-EE5D3D537E6B"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IMyDotNetInterface
    {
        void ShowCOMDialog();
    }
}

我的实现接口的C#class:

namespace MyInterop
{

    [Guid("38939B1E-461C-4825-80BB-725DC7A88836"), ClassInterface(ClassInterfaceType.None)]
    public class MyDotNetClass : IMyDotNetInterface
    {
        public MyDotNetClass()
        { }

        public void ShowCOMDialog()
        {
            MessageBox.Show("I am a" + 
                  "  Managed DotNET C# COM Object Dialog");
        }
    }
}

非常简单,因为我现在正在测试。我现在将 tlb 导入我的 C++ 文件

#import "<Path to file>\MyInterop.tlb" raw_interfaces_only

最后我试着调用它:

HRESULT hr = CoInitialize(NULL);

MyInterop::IMyDotNetInterfacePtr MyDotNetClass(__uuidof(MyInterop::MyDotNetClass));

MyDotNetClass->ShowCOMDialog();

CoUninitialize();

但是,VS 告诉我 ShowCOMDialog 不是我的界面的成员。我错过了什么吗?

通过声明 raw_interfaces_only,您已经抑制了包装函数的生成,如 this link. And since your interface is based on IDispatch, you are forced to call your interface methods indirectly via IDispatch's Invoke 中所示。

建议:

  1. 将接口类型更改为 ComInterfaceType.InterfaceIsDualComInterfaceType.InterfaceIsIUnknown
  2. 删除 raw_interfaces_only 以便使用生成的包装函数。