我在C#中定义了一个接口,该接口将在C#中实现,但是从非托管C ++模块作为COM对象调用。
我知道我想要/需要C ++ API的样子以及我如何通过ODL定义它:
//args is an array of BSTR e.g VT_ARRAY|VT_BSTR
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args);
我不确定如何在C#中设置它以使TLB定义与VARIANT
相匹配。
它可以像以下一样简单吗?
void DoMethod(string name, string args[])
我一直在寻找COM / .NET互操作文档,但要么我错过了相关部分,要么根本不理解所描述的内容!
顺便说一句,如何查看给定C#接口的COM定义?是否容易检查DLL / TLB?
答案 0 :(得分:1)
如果你想在C ++方面使用变体(为什么?),那么你需要声明它:
using System.Runtime.InteropServices;
namespace LibraryName {
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IFoo {
void DoMethod(string name, object args);
}
}
使用Regasm.exe / codebase / tlb注册C#程序集。 / tlb选项生成类型库,您可以使用#import指令在C ++代码中使用它。这看起来足够了,它生成的LibraryName.tlh文件具有声明。或者,您可以从Visual Studio命令提示符运行Oleview.exe并使用文件>查看Typelib来查看它。
你原来的本能选择更好,string []在C ++端显示为SAFEARRAY *。通过这种方式减少事故。