将 COM 类转换为 C#C++以便由可执行文件C++调用
本文关键字:可执行文件 C++ 调用 C#C++ COM 转换 | 更新日期: 2023-09-27 18:33:03
抱歉,但这是来自 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]属性装饰接口。