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

标签 c# c++ com com-interop

我在 C# 中定义一个接口(interface),它将在 C# 中实现,但作为 COM 对象从非托管 C++ 模块调用。

我知道我想要/需要 C++ API 是什么样子以及我如何通过 ODL 定义它:

//args is an array of BSTR e.g VT_ARRAY|VT_BSTR
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args);

关于 VARIANT,我不确定如何在 C# 中进行设置以使 TLB 定义与之匹配。 可以像下面这样简单吗?

void DoMethod(string name, string args[])

我一直在查看 COM/.NET 互操作文档,但要么我错过了这部分内容,要么根本不理解其中的描述!

顺便说一句,我如何才能看到为给定的 C# 接口(interface)发出的 COM 定义? 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 选项生成类型库,您可以通过#import 指令在 C++ 代码中使用它。看看就够了,它生成的 LibraryName.tlh 文件有声明。或者您可以从 Visual Studio 命令提示符运行 Oleview.exe 并使用文件 > 查看类型库来查看它。

您最初的直觉选择更好,string[] 在 C++ 端显示为 SAFEARRAY*。这样可以减少事故。

关于c# - 如何将 C# 接口(interface)的方法参数公开为特定的 COM/ODL 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995665/

相关文章:

c++ - dll + boost + VS2015 + WinXP ==崩溃

c++ - 内联函数的前向声明

c++ - 如何包装 VB 代码和 C++ 代码并将其作为 3 个 COM 接口(interface)提供给第三方?

c# - 修改 JavaScript 中的字符串、日期和数字对象

c# - C#中常量的意义是什么

c++ - 从具有相同虚函数的父派生时如何调用子函数

c++ - 了解 tagVARIANT 结构

c - 如何获得某些 Visual Basic 6 控件的 IUnknown* 指针(如果有)?

c# - 在 C# 中将水平线放在组合框或列表控件中

c# - 从另一个应用程序接收的UDP数据包中读取远程IP