【问题标题】:Is it possible to use VB6 enums which have values with spaces in C#?是否可以在 C# 中使用带有空格的值的 VB6 枚举?
【发布时间】:2015-06-12 13:12:05
【问题描述】:

我们有一个包含多个枚举定义的 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 代码必须相应地更改。

谢谢

【问题讨论】:

  • "我们可以做些什么来让枚举值显示出来吗?"否 - C# 不支持枚举名称中的空格。这是不符合 CLS 的 VB 语言功能的示例(c# 也有它们,例如仅在大小写上有所不同的公共成员)。如果您计划使用多种 .NET 语言进行开发,请考虑添加 CLSCompliant 属性以确保您不会再发现这些语言。
  • “注意 - 如果需要,我可以修改 VB6 DLL,但这不是首选,因为必须相应地更改一堆其他 VB6 代码。” -- 您可以为同一个枚举值提供两个不同的名称,以便同一个枚举类型同时包含EnumAEnum A。这将避免使用 VB6 DLL 更新其他代码的需要。
  • @DStanley 但这个 DLL 是 COM 导入,而不是 .NET 项目。所以我原以为互操作功能可以解决这个问题,并希望有办法实现这一点。
  • 这不是 stackoverflow.com/questions/1117542/spaces-in-c-sharp-enums 的副本。该问题涉及在 C# 中定义的枚举。这个问题是关于从 VB6 生成的 COM DLL 中定义的枚举。
  • @DaveInCaz 自从我使用 VB6 以来已经太久了,我不知道该怎么做。如果您可以使其正常工作,请随时将其发布为自己的答案。您应该能够更轻松地包含足够的详细信息来帮助遇到相同问题的其他人。

标签: c# .net enums vb6 com-interop


【解决方案1】:

根据@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,尽管一开始维护工作量很大。随着时间的推移,这个想法将不再添加新的枚举值,其中包含空格。

我没有检查这是否会破坏二进制兼容性,但如果是这样,那将是一个不利因素,尽管我们可以忍受它。

【讨论】:

  • 虽然这可行,但我将等待将其标记为答案,以防万一在 COM / 引用级别有一个聪明的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2016-08-31
相关资源
最近更新 更多