我有一个通过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中看到了所有其他类型。
发布于 2009-08-14 07:30:05
VBScript和其他后期绑定客户端使用IDispatch来调用对象上的方法。因此,这些语言无法访问类型库中的类型信息--它们只是从GUID创建一个对象,取回一个IDispatch指针,并开始按名称调用方法。
我不确定问题的COM互操作部分,但即使枚举在OleView中显示,您也不能直接使用它们。
但是,如果您能够在类型库中发布枚举,我在很久以前就编写了一个工具,它可以生成一个脚本文件(vbs或js),其中包含来自类型库的所有枚举作为常量。
查看此处:http://www.kontrollbehov.com/tools/tlb2const/
发布于 2009-08-14 11:29:16
我使COM可见的(到目前为止唯一的) .NET程序集也有枚举类型,它在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;在类型库中。
发布于 2018-07-23 23:33:43
我知道这是一个非常古老的帖子,但我将为未来的探索者添加我的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在枚举中是有效的。
https://stackoverflow.com/questions/1276442
复制相似问题