【问题标题】:Is it possible to expose a C# Enum to COM Interop callers, and if so, how?是否可以向 COM 互操作调用者公开 C# 枚举,如果可以,如何?
【发布时间】:2009-08-14 07:09:46
【问题描述】:

我有一个通过 COM 互操作调用的托管程序集。像 VBScript 客户端、Perl 客户端等等。

类用

装饰
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

然后我当然会做 regasm 的事情,所有方法都可以正常工作。

但程序集中也有枚举类型。我想对枚举值使用符号名称 COM 应用程序。

如何通过 COM 互操作公开枚举?我只需要添加这些属性吗?

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

然后,如何在 VBScript 中引用这些符号名称?我在 OleView 中看不到枚举类型。 (我应该吗?)我在 OleView 中看到了所有其他类型。

【问题讨论】:

    标签: .net enums com interop oleview


    【解决方案1】:

    我使 COM 可见的(到目前为止).NET 程序集也有一个枚举类型,它在 OleView 中显示得很好。我让整个库对 COM 可见,所以

    [ComVisible(true)]
    

    没有必要。你的枚举类型是公开的吗?

    发生的一件事是不同的枚举以“枚举类型名称”_为“前缀”:

    public enum DataType
    {
        INT32,
        FLOAT64,
        INT8
    }
    

    变成:

    typedef [...]
    enum {
        DataType_INT32 = 0,
        DataType_FLOAT64 = 1,
        DataType_INT8 = 2
    } DataType;
    

    在类型库中。

    【讨论】:

    • 当项目设置为 ComVisible(true) 时,我所有的枚举都工作正常,但是我不得不在 VS6 C++ 项目中使用 asm,tlb 太大了!!我将整个项目设置为 false,并公开了我想要的类和枚举。课程很好,枚举不是!!???它们按预期在注册表(CLSID)中,但根本无法访问。很想知道为什么..
    • 投了赞成票,因为我找不到任何明确的解释说明 COM 神奇地重命名您的枚举值以在它们前面加上枚举类型的名称,除了这里。
    【解决方案2】:

    VBScript 和其他后期绑定客户端使用 IDispatch 调用对象上的方法。因此,这些语言无法访问类型库中的类型信息——它们只是从 GUID 创建一个对象,返回一个 IDispatch 指针,然后开始按名称调用方法。

    我不确定问题的 COM 互操作部分,但即使枚举确实显示在 OleView 中,您也无法直接使用它们。

    但是,如果您能够在 typelib 中发布枚举,我在 eons 之前编写了一个工具,它可以生成一个脚本文件(vbs 或 js),其中包含来自 typelib 的所有枚举作为常量。

    请看这里:http://www.kontrollbehov.com/tools/tlb2const/

    【讨论】:

    • 不幸的是我没有 Perl 的常量生成器...也许是时候重新开始开发了 :-)
    【解决方案3】:

    我知道这是一个非常古老的线程,但我会为未来的探索者添加我的 2 美分。当我在 C# 中定义一个枚举时,我用 [Guid(...), ComVisible(true)] 而不是 GuidAttribute 来装饰它。
    例如:

    [Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
    public enum myEnum
    {
        first,
        second,
        third,
        fourth
    }
    

    然后枚举将在 VB6 中作为 myEnum_first、myEnum_second 等可用。

    您也可以在该列表中包含键值的分配,因此 first = 1 在枚举中有效。

    【讨论】:

    • GuidAttribute 是 [Guid] 属性的类名。使用一个或另一个是相同的。所有属性都声明为 Attribute,然后您可以将其用作 []。
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多