【问题标题】:How to expose a C# interface's method arguments as specific COM/ODL types?如何将 C# 接口的方法参数公开为特定的 COM/ODL 类型?
【发布时间】:2016-01-04 21:18:19
【问题描述】:

我在 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);

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

void DoMethod(string name, string args[])

我一直在查看 COM/.NET 互操作文档,但要么我错过了这部分,要么就是不明白所描述的内容!

顺便说一句,我如何查看为给定 C# 接口发出的 COM 定义? DLL/TLB 是否易于检查?

【问题讨论】:

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


    【解决方案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 选项生成类型库,您可以在 C++ 代码中使用 #import 指令来使用它。看看就够了,它生成的 LibraryName.tlh 文件有声明。或者您可以从 Visual Studio 命令提示符运行 Oleview.exe 并使用 File > View Typelib 来查看它。

    您最初的本能选择更好,string[] 在 C++ 端显示为 SAFEARRAY*。这样事故就少了。

    【讨论】:

    • So object VARIANT,我在询问后发现了这一点,但我仍然不确定如何创建这个对象以编组为正确类型的变体?您能否添加DoMethod() 的(伪)实现?至于变体 Vs safearray - 我们最初的 C++ 项目一直都是这样做的,而不是通过裸的 safearrays。我不能告诉你为什么,它已经快 20 岁了!
    • Erm,不确定该请求如何有意义,它是调用者必须创建数组并将其填充到变体中。 DoMethod() 消耗它。
    • 是的,你是对的。虽然如果它是一个输出参数,我仍然会对同样的基本问题感兴趣,但这不是我现在需要的......谢谢你发现这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多