如何将C#接口的方法参数公开为特定的COM / ODL类型?

时间:2015-10-07 14:57:52

标签: c# c++ com com-interop

我在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?

1 个答案:

答案 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 *。通过这种方式减少事故。