将 COM 类转换为 C#C++以便由可执行文件C++调用

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

本文关键字:可执行文件 C++ 调用 C#C++ COM 转换      更新时间:2023-10-16

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

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

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(其代码不可用)会根据构建体系结构返回这两个错误(顶部是"x64",底部是"任何 CPU")。

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

正如我所说,我不流利C++但在我看来,这应该有效。

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