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

Che*_*eso 13 .net com enums interop oleview

我有一个通过COM Interop调用的托管程序集.像VBScript客户端,Perl客户端等.

课程装饰有

[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)

然后当然我做了regasm的事情,所有方法都运行得很好.

但是程序集中也有枚举类型.我想使用符号名称COM应用程序,用于枚举值.

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

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)

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

And*_*s F 13

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

[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)

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

发生的一件事是,不同的枚举与'枚举类型名称'''前缀':

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}
Run Code Online (Sandbox Code Playgroud)

转换成:

typedef [...]
enum {
    DataType_INT32 = 0,
    DataType_FLOAT64 = 1,
    DataType_INT8 = 2
} DataType;
Run Code Online (Sandbox Code Playgroud)

在类型库中.


Kim*_*man 3

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

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

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

请参阅此处: http: //www.kontrollbehov.com/tools/tlb2const/