【问题标题】:Does EnumBuilder always create enum which are not CLS-Compliant ? How to make the enum CLS compliant?EnumBuilder 是否总是创建不符合 CLS 的枚举?如何使枚举 CLS 兼容?
【发布时间】:2014-10-13 11:13:57
【问题描述】:

以下代码示例生成 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.Elev”不符合 CLS

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

【问题讨论】:

    标签: c# enums cls-compliant assemblybuilder


    【解决方案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 }));
    

    【讨论】:

      【解决方案2】:

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

      更多信息请参见MSDN

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

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

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

      【讨论】:

      • 或第三种选择:从 TestA 程序集的公共接口中删除 Elevation 枚举。 (这并不妨碍它在内部使用。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多