C# COM INTEROP in c++

C# COM INTEROP in c++

本文关键字:c++ in INTEROP COM      更新时间:2023-10-16

我正在尝试从C 客户端拨打我的C#dll,到目前为止,我都有DLL所有设置和注册表中的DLL(我可以从电源壳中创建并调用它,例如)。

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

我的C#接口:

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

我的C#类实现接口:

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,您已经将包装函数的生成旋转,如本链接中所示。而且,由于您的接口基于IDispatch,因此您被迫通过IDISPATCH的Invoke间接调用接口方法。

建议:

  1. 将您的接口类型更改为ComInterfaceType.InterfaceIsDualComInterfaceType.InterfaceIsIUnknown
  2. 删除raw_interfaces_only以使用生成的包装器功能。