【发布时间】: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。