首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将C#枚举公开给COM互操作调用者,如果可以,如何公开?

是否可以将C#枚举公开给COM互操作调用者,如果可以,如何公开?
EN

Stack Overflow用户
提问于 2009-08-14 07:09:46
回答 3查看 10.9K关注 0票数 13

我有一个通过COM Interop调用的托管程序集。比如VBScript客户端、Perl客户端等等。

这些类使用

代码语言:javascript
复制
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

当然,我做了regasm的事情,所有的方法都工作得很好。

但是程序集中也有枚举类型。我想使用COM应用程序的符号名称来表示枚举值。

如何通过COM互操作公开枚举?我只需要添加这些属性吗?

代码语言:javascript
复制
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]

那么,如何在VBScript中引用这些符号名称呢?我在OleView中看不到枚举类型。(我应该这样做吗?)我在OleView中看到了所有其他类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-14 07:30:05

VBScript和其他后期绑定客户端使用IDispatch来调用对象上的方法。因此,这些语言无法访问类型库中的类型信息--它们只是从GUID创建一个对象,取回一个IDispatch指针,并开始按名称调用方法。

我不确定问题的COM互操作部分,但即使枚举在OleView中显示,您也不能直接使用它们。

但是,如果您能够在类型库中发布枚举,我在很久以前就编写了一个工具,它可以生成一个脚本文件(vbs或js),其中包含来自类型库的所有枚举作为常量。

查看此处:http://www.kontrollbehov.com/tools/tlb2const/

票数 3
EN

Stack Overflow用户

发布于 2009-08-14 11:29:16

我使COM可见的(到目前为止唯一的) .NET程序集也有枚举类型,它在OleView中显示得很好。我让整个库都是COM可见的

代码语言:javascript
复制
[ComVisible(true)]

是不必要的。您的枚举类型是公共的吗?

发生的一件事是不同的枚举被'enum type name‘作为’前缀‘_

代码语言:javascript
复制
public enum DataType
{
    INT32,
    FLOAT64,
    INT8
}

变成了:

代码语言:javascript
复制
typedef [...]
enum {
    DataType_INT32 = 0,
    DataType_FLOAT64 = 1,
    DataType_INT8 = 2
} DataType;

在类型库中。

票数 13
EN

Stack Overflow用户

发布于 2018-07-23 23:33:43

我知道这是一个非常古老的帖子,但我将为未来的探索者添加我的2美分。当我在C#中定义枚举时,我用Guid(...)、ComVisible(true)而不是GuidAttribute来修饰它。

例如:

代码语言:javascript
复制
[Guid("28637488-C6B3-44b6-8621-867441284B51"), ComVisible(true)]
public enum myEnum
{
    first,
    second,
    third,
    fourth
}

则枚举将在VB6中作为myEnum_first、myEnum_second等可用。

您还可以在该列表中包括键值的赋值,因此first =1在枚举中是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1276442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档