我有一个管理组件被通过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。
VBScript和其他后期绑定客户端使用IDispatch接口来调用对象的方法。 因此,这些语言用不上了在类库键入信息 - 他们只是从一个GUID创建一个对象,得到一个IDispatch指针,然后开始通过名称调用方法。
我不能确定这个问题的COM互操作部分,但即使在枚举OLEVIEW确实表明,你将无法直接使用它们。
但是,如果你能发布的枚举类型库,我写了一个工具,亿万年前,可以生成一个脚本文件,其中包含所有的类型库作为常量枚举(VBS或JS)。
在这里看到: http://www.kontrollbehov.com/tools/tlb2const/
我犯了COM可见我的(到目前为止只).NET程序集也有一个枚举类型,这表明了在OLEVIEW就好了。 我整库是COM可见这样
[ComVisible(true)]
是没有必要的。 是您的枚举类型的公共?
所发生的一件事是不同的枚举是“前缀”与“枚举类型name'_:
public enum DataType
{
INT32,
FLOAT64,
INT8
}
转换成:
typedef [...]
enum {
DataType_INT32 = 0,
DataType_FLOAT64 = 1,
DataType_INT8 = 2
} DataType;
在类型库中。
我知道这是一个非常古老的线程,但我要添加2美分,为未来的探险家。 当我定义在C#中的枚举我用[的Guid(...),标记有ComVisible特性(真)]不GuidAttribute装饰。
例如:
[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
first,
second,
third,
fourth
}
然后枚举将在VB6作为myEnum_first,myEnum_second等等可用。
您可以在该列表中的键值的分配一样,所以首先= 1将在枚举有效。