是否有可能暴露C#枚举到COM互操作调用者,如果是这样,怎么样?(Is it possible to

2019-08-01 05:35发布

我有一个管理组件被通过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。

Answer 1:

VBScript和其他后期绑定客户端使用IDispatch接口来调用对象的方法。 因此,这些语言用不上了在类库键入信息 - 他们只是从一个GUID创建一个对象,得到一个IDispatch指针,然后开始通过名称调用方法。

我不能确定这个问题的COM互操作部分,但即使在枚举OLEVIEW确实表明,你将无法直接使用它们。

但是,如果你能发布的枚举类型库,我写了一个工具,亿万年前,可以生成一个脚本文件,其中包含所有的类型库作为常量枚举(VBS或JS)。

在这里看到: http://www.kontrollbehov.com/tools/tlb2const/



Answer 2:

我犯了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;

在类型库中。



Answer 3:

我知道这是一个非常古老的线程,但我要添加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将在枚举有效。



文章来源: Is it possible to expose a C# Enum to COM Interop callers, and if so, how?