C#.NET –如何检查动态程序集是否可收集?

时间:2019-01-23 14:58:58

标签: c# .net .net-assembly dynamic-assemblies

如何检查动态装配是否可以收藏?

期望:

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

  }
}

1 个答案:

答案 0 :(得分: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;
}