将 C++ COM class 转换为 C# 以供 C++ 可执行文件调用

Convert C++ COM class to C# for invocation by C++ executable

抱歉,这是来自 C# 人员的 C++ 与 C# 集成问题!

我有一个 C++ EXE,它从 COM DLL 调用方法,该 DLL 注册为具有特定 class ID 的 InProcServer32。

EXE是这样调用的:

EXENAME --UseClassId {CLSID}

此时 COM DLL 是用 C++ 构建的,核心“.h”文件如下所示:

class DECLSPEC_UUID("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX1}") ImplementationClass : public ComClass<IInterfaceMain>
{
public:
    IFACEMETHODIMP Method1(IInterfaceSub1 **param1) _NOEXCEPT override { return 1; }
    IFACEMETHODIMP Method2(IInterfaceSub1** param2) _NOEXCEPT override { return 1; }
};

CoCreatableClass(ImplementationClass)
}}}

它使用的接口是这样定义的:

MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX2")
    IInterfaceMain : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Method1(IInterfaceSub1 **param1) = 0;        
        virtual HRESULT STDMETHODCALLTYPE Method2(IInterfaceSub2 **param2) = 0;                       
    };

...和上面使用的接口也是类似定义的

现在,我想在 .Net 中创建这个 COM DLL。所以代码目前看起来像这样:

[ComVisible(true), Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX1"), ClassInterface(ClassInterfaceType.None)]
public class ImplementationClass : IInterfaceMain
{
    public ImplementationClass() {}

    public int Method1(IInterfaceSub1 param1) { return 1; }
    public int Method2(IInterfaceSub2 param2) { return 1; }
}

我也在 C# 中创建了主界面,就像这样(但没有任何 MIDL_INTERFACE / Guid):

public interface IInterfaceMain
{
    int Method1(IInterfaceSub1 param1);
    int Method2(IInterfaceSub2 param2);
}

调用主 EXE(其代码不可用)returns 这两个错误取决于构建架构(顶部是 "x64" 底部是 "Any CPU")。

0x80004002 No such interface supported
0x800401f9 Error in the DLL.

正如我所说,我对 C++ 不是很流利,但在我看来这 应该 工作。

由 Hans Passant 提供,答案是使用正确的 [ComVisible]、[Guid] 和 [InterfaceType] 属性装饰界面。