是否有可能暴露C#枚举到COM互操作调用者,如果是这样,怎么样?
题
我有一个管理组件,其被经由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)含有来自类型库为常数的所有枚举。
其他提示
,我提出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。将在枚举有效。