EnumBuilder是否始终创建不符合CLS的枚举?如何使enum符合CLS?

时间:2014-10-13 11:13:58

标签: c# enums cls-compliant assemblybuilder

下面的代码示例生成带有枚举高程的TempAssembly.dll。

 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(真)]

我收到警告的代码是:

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

警告

  

警告1' TestA.TestClass.Elev的类型'不符合CLS

我查看了有关如何编写CLS兼容代码的文档,但由于动态创建了枚举,因此无法做很多事情。任何建议,我如何使枚举符合CLS?

2 个答案:

答案 0 :(得分:1)

您是否尝试将程序集标记为符合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 }));

答案 1 :(得分:0)

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

有关详情,请参阅MSDN

  

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

     
      
  • 装配不符合CLS。
  •   
  • 仅当其封闭类型或程序集符合CLS时,该类型才符合CLS。
  •   
  • 仅当类型符合CLS时,类型的成员才符合CLS。
  •   

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