我有一个通过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中看到了所有其他类型。
答案 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),其中包含来自类型库的所有枚举作为常量。
答案 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在枚举中有效。