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

How to expose a C# interface's method arguments as specific COM/ODL types?

本文关键字:COM 类型 ODL 接口 方法 参数      更新时间:2023-10-16

我正在用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[])

我一直在环顾四周。. NET互操作文档,但要么我错过了这部分,要么只是不理解所描述的内容!

作为题外话,我怎么能看到什么COM定义正在发出一个给定的c#接口?DLL/TLB是否容易检查?

如果你想要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选项生成类型库,您可以在c++代码中通过#import指令使用它。这就足够看了,LibraryName。它生成的TLH文件包含声明。或者你可以从Visual Studio命令提示符中运行Oleview.exe,然后使用File> View Typelib查看它。

你最初的本能选择是更好的,string[]在c++端显示为SAFEARRAY*。这样可以减少事故。