C#.NET - как проверить, можно ли собирать динамическую сборку?

Как можно проверить, является ли динамическая сборка коллекционной?

Expectation:

if(assembly.IsDynamic)
{
  if(assembly.IsCollectable) {

  }
}

1 ответ

В настоящее время это невозможно сделать разумно безопасным способом, но это может быть достигнуто путем размышлений.

AssemblyBuilder dynamicCollectibleAssembly = AssemblyBuilder.DefineDynamicAssembly(
  new AssemblyName("CollectibleAssembly"),
  AssemblyBuilderAccess.RunAndCollect, 
  Enumerable.Empty<CustomAttributeBuilder>());

Type dynCollAssemType = dynamicCollectibleAssembly.GetType();

try
{
  Type assemblyBuilderDataType = Assembly.GetAssembly(typeof(AssemblyBuilder))
      .GetType("System.Reflection.Emit.AssemblyBuilderData");

  object assemblyBuilderData = dynCollAssemType
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    .Single(fi => fi.FieldType == assemblyBuilderDataType)
    .GetValue(dynamicCollectibleAssembly);

  object assemblyBuilderAccess = assemblyBuilderDataType
    .GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
    .Single(fi => fi.FieldType == typeof(AssemblyBuilderAccess))
    .GetValue(assemblyBuilderData);

  Console.WriteLine(assemblyBuilderAccess);
}
catch (Exception e)
{
  throw e;
}
Другие вопросы по тегам