Ниже образца кода генерируется TempAssembly.dll с надписью Enum Elevation.Всегда ли EnumBuilder создает перечисление, не совместимое с CLS? Как сделать enum CLS совместимым?
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 и использовал перечисления Elevation в другом проекте (скажем проекта Testa). Как я хочу, чтобы код был CLS-совместимым, я добавил в проект TestA следующий атрибут.
[сборка: System.CLSCompliant (истина)]
код, где я получаю предупреждение является:
public class TestClass
{
public Elevation Elev { get; set; }
}
Предупреждение
Предупреждение 1 Тип «TestA.TestClass.Elev» не соответствует CLS
Я проверил документацию о том, как писать CLS-совместимый код, но я не могу многого сделать, поскольку динамическое перечисление создается динамически. Любые предложения, как я могу сделать enum CLS совместимым?
Или третий вариант: удалить 'Elevation' перечисления из общего интерфейса сборки Теста. (Это не мешает ему использовать внутренне.) – hvd