我有一个管理组件,其被经由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)]

是没有必要的。是您的枚举类型的公共?

有一件事情发生的情况是,不同的枚举了“前缀”与“枚举类型名称” _:

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。将在枚举有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top