EnumBuilder是否总是创建不符合CLS的枚举?如何使枚举CLS兼容

本文关键字:枚举 CLS 何使 兼容 是否 创建 不符合 EnumBuilder | 更新日期: 2023-09-27 18:26:23

下面的代码示例生成TempAssembly.dll,其中包含枚举Elevation。

 public static void Main()
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            AssemblyName aName = new AssemblyName("TempAssembly");
            AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
            EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int));
            eb.DefineLiteral("Low", 0);
            eb.DefineLiteral("High", 1);
            Type finished = eb.CreateType();
            ab.Save(aName.Name + ".dll");
            foreach (object o in Enum.GetValues(finished))
            {
                Console.WriteLine("{0}.{1} = {2}", finished, o, ((int)o));
            }
        }

我引用了TempAssembly.dll,并在另一个项目(比如项目TestA)中使用了枚举Elevation。由于我希望代码符合CLS,我在项目TestA中添加了以下属性。

[汇编:System.CLSCompliant(true)]

我得到警告的代码是:

public class TestClass
{
    public Elevation Elev { get; set; } 
}

警告

警告1"TestA.TestClass.Elv"类型不符合CLS的

我查看了关于如何编写CLS兼容代码的文档,但由于枚举是动态创建的,我无法做太多工作。有什么建议吗?我该如何使枚举CLS兼容?

EnumBuilder是否总是创建不符合CLS的枚举?如何使枚举CLS兼容

您是否尝试将程序集标记为符合CLS?

ab.SetCustomAttribute(new CustomAttributeBuilder(
        typeof(CLSCompliantAttribute).GetConstructor(new[] { typeof(bool) }),
        new object[] { true }));

你也应该能够在eb上做同样的事情:

eb.SetCustomAttribute(new CustomAttributeBuilder(
        typeof(CLSCompliantAttribute).GetConstructor(new[] { typeof(bool) }),
        new object[] { true }));

CLSCompliantAttribute应用于TestA程序集时,还需要将CLSCompliantAttribute添加到动态创建的TempAssembly中。由于属性未在其上定义,因此默认情况下它不符合CLS。

有关更多信息,请参阅MSDN:

如果没有CLSCompliantAttribute应用于程序元素,则默认情况下:

  • 程序集不符合CLS
  • 只有当该类型的封闭类型或程序集符合CLS时,该类型才符合CLS
  • 只有当类型符合CLS时,该类型的成员才符合CLS

所以你有两个选择。从TestA程序集中删除CLSCompliantAttribute,或将CLSCompliantAattribute添加到TempAssembly中。