【问题标题】:Convert C++ COM class to C# for invocation by C++ executable将 C++ COM 类转换为 C# 以供 C++ 可执行文件调用
【发布时间】:2016-02-02 15:22:13
【问题描述】:

抱歉,这是来自 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++,但在我看来,这应该工作。

【问题讨论】:

  • 您还必须为接口添加属性。使用 [ComVisible]、[Guid] 和 [InterfaceType]/
  • 明白了,汉斯,ta。

标签: c# c++ interface com


【解决方案1】:

感谢 Hans Passant,答案是用正确的 [ComVisible]、[Guid] 和 [InterfaceType] 属性装饰接口。

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多