2014-10-13 2 views
1

Ниже образца кода генерируется 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 совместимым?

ответ

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 })); 
0

Когда вы наносите CLSCompliantAttribute вам Testa сборки также необходимо добавить к вашему CLSCompliantAttribute динамически созданного TempAssembly. Поскольку атрибут на нем не определен, он по умолчанию не соответствует CLS.

Смотрите также MSDN для получения дополнительной информации:

Если нет CLSCompliantAttribute не применяется к элементу программы, то по умолчанию:

  • Узел не CLS-совместимым.
  • Тип CLS-совместимый, только если его закрывающий тип или сборка соответствует требованиям CLS.
  • Член типа CLS-совместимый, только если тип CLS-совместимый.

У вас есть два варианта. Удалите CLSCompliantAttribute из сборки TestA или добавьте CLSCompliantAttribute к вашей TempAssembly.

+0

Или третий вариант: удалить 'Elevation' перечисления из общего интерфейса сборки Теста. (Это не мешает ему использовать внутренне.) – hvd