在非当前AppDomain上使用DefineDynamicAssembly动态创建程序集时发生异常

时间:2012-11-20 07:08:17

标签: .net dynamic reflection .net-assembly reflection.emit

我想在集成测试中动态创建程序集,以便测试一些程序集操作类。如果我使用以下代码创建测试程序集:

var domain = AppDomain.CurrentDomain;

var builder = domain.DefineDynamicAssembly(
    new AssemblyName(assemblyName),
    AssemblyBuilderAccess.Save,
    directory);

builder.Save(fileName);

然后一切运行正常,程序集在所需位置创建,但作为其中的一部分,它们也被加载到当前AppDomain,这是我不想要的。

所以我想使用单独的AppDomain

创建程序集
var domain = AppDomain.CreateDomain("Test");

...

但是运行代码会在行var builder = domain.DefineDynamicAssembly(...);处抛出异常:

  

System.Runtime.Serialization.SerializationException:在程序集'mscorlib中输入'System.Reflection.Emit.AssemblyBuilder',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化。

我不知道这与在非当前DefineDynamicAssembly上调用AppDomain有何关系。我在网上找到的主要是关于在不同的域中执行程序集。也许我在这里尝试做的只是太具体,太高级甚至根本不推荐,但它可以让我测试我们所有的装配操作代码。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我通过执行其他AppDomain中的代码来实现它,例如suggested

var appdomain = AppDomain.CreateDomain("CreatingAssembliesAndExecutingTests", null,
   new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase });

appdomain.DoCallBack(() =>
{
   var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("temp"), AssemblyBuilderAccess.Run);
   var module = assembly.DefineDynamicModule("DynModule");
   var typeBuilder = module.DefineType("MyTempClass", TypeAttributes.Public | TypeAttributes.Serializable);
});

备注你必须在AppDomainSetup上指定ApplicationBase才能在其他AppDomain中找到委托。