下面的代码示例生成带有枚举高程的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?
答案 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。