13

我有一个通过 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 中看到了所有其他类型。

4

3 回答 3

13

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

[ComVisible(true)]

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

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

public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

转换成:

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

在类型库中。

于 2009-08-14T11:29:15.607 回答
3

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

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

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

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

于 2009-08-14T07:30:05.353 回答
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 在枚举中将是有效的。

于 2018-07-23T15:33:42.923 回答