c# - 是否可以在 C# 中使用具有带空格值的 VB6 枚举?

标签 c# .net enums vb6 com-interop

我们有一个 VB6 DLL,其中包含几个枚举定义。我们已将 VB6 DLL 作为引用加载到 C# 项目中。

在 VB6 中,您可以使用特殊的方括号语法声明名称中包含空格的枚举值。示例:

Public Enum TestEnumNoSpaces
    EnumA
    EnumB
    EnumC
End Enum

Public Enum TestEnumWithSpaces
    [Enum A]
    [Enum B]
    [Enum C]
End Enum

如果将其编译为 DLL 并将其作为引用加载到 Visual Studio 2010 中,则在对象浏览器中两个枚举都可见。但是,枚举 不会针对 TestEnumWithSpaces 显示,并且在 C# 代码中使用智能感知时也不会列出。 TestEnumNoSpaces 的值正常列出。

如果我在代码窗口中单击 TestEnumWithSpaces 并选择 Go To Definition,我会得到如下信息:

namespace DLLName
{
    [Guid("3DD0C797-2BF0-4A7A-8E1E-83E3095CB3AE")]
    public enum TestEnumWithSpaces
    {
    }
}

对于 TestEnumNoSpaces 也是如此:

namespace DLLName
{
    [Guid("9A7152DB-20D7-49D8-8E33-E74F895DFE05")]
    public enum TestEnumNoSpaces
    {
        EnumA = 0,
        EnumB = 1,
        EnumC = 2,
    }
}

这显示了同样的事情 - 枚举没有值。

我们可以做些什么来让枚举值显示出来吗?在问题Spaces in C# Enums对于在 C# 中定义的枚举,显示了一种方法,但不适用于像我这样通过 COM 互操作导入的枚举。

注意 - 如有必要,我可以修改 VB6 DLL,但这不是首选,因为一堆其他 VB6 代码必须相应地更改。

谢谢

最佳答案

根据@hvd 的建议,我在 VB6 中构建了这个示例:

Public Enum TestEnumWithSpaces
    [Enum A] = 0
    EnumA = [Enum A]
    [Enum B] = 1
    EnumB = [Enum B]
    [Enum C] = 2
    EnumC = [Enum C]
End Enum

这确实按预期工作 - 没有空格的枚举值显示在 C# 中。

我认为这可能是一个可行的选择,因为我们有能力修改 VB6 DLL,尽管一开始维护工作量很大。随着时间的推移,我们的想法是不再添加其中包含空格的新枚举值。

我还没有检查这是否会破坏二进制兼容性,但如果是的话那将是一个缺点,尽管我们可以接受它。

关于c# - 是否可以在 C# 中使用具有带空格值的 VB6 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30803987/

相关文章:

c# - 如何显示两个日期之间的计算值,仅小时和分钟超过 C# 中的 24 小时差异

python - 无法获取建议的枚举值

c++ - 什么是模板上下文中的成员枚举?

c# - MvxListView 不像普通的 xamarin ListView 那样流畅

c# - 通用集合继承

C# - 关键字用法 virtual+override 与 new

c# - 如何在单元测试中将 FakeItEasy 与 HttpClient 一起使用?

java - Java 中的枚举和多态性,扑克牌示例

c# - 在 XNA 中从文件动态编译和运行着色器

c# - 使用 .Net 4.0 时出现 PInvoke StackImbalance 错误,但使用 .Net 2.0 时则不会