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

时间:2015-06-12 13:12:05

标签: 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#代码中使用intellisense时也未列出。 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中,为CMS中定义的枚举显示了一种方法,但这不适用于通过COM互操作导入的枚举,如我的情况。

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

由于

1 个答案:

答案 0 :(得分:0)

扩展了@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,尽管它在开始时相当重要。随着时间的推移,我们的想法是不再添加带有空格的新枚举值。

我还没有检查这是否打破了二进制兼容性,但如果是这样,那将是一个缺点,尽管我们可以忍受它。