是否可以将C#Enum暴露给COM Interop调用者,如果是这样,怎么样?

时间:2009-08-14 07:09:46

标签: .net enums com interop oleview

我有一个通过COM Interop调用的托管程序集。像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中看到了所有其他类型。

3 个答案:

答案 0 :(得分:13)

我的(迄今为止).NET程序集,我使COM-visible也有一个枚举类型,在OleView中显示得很好。我让整个库都是COM可见的,所以

[ComVisible(true)]

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

发生的一件事是,不同的枚举以“enum type name”为前缀':

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

变成:

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

在类型库中。

答案 1 :(得分:3)

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

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

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

见这里:http://www.kontrollbehov.com/tools/tlb2const/

答案 2 :(得分:0)

我知道这是一个非常老的话题,但是我会为以后的探索者加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在枚举中有效。