【问题标题】:Exception while dynamically creating assemblies using DefineDynamicAssembly on non-current AppDomain在非当前 AppDomain 上使用 DefineDynamicAssembly 动态创建程序集时出现异常
【发布时间】:2012-11-08 05:20:09
【问题描述】:

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

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,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中键入“System.Reflection.Emit.AssemblyBuilder”未标记为可序列化。

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

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

【问题讨论】:

  • 您能否发布引发该异常的实际代码?为什么你不想将它加载到当前的 AppDomain 中?如果您担心内存问题,不妨试试AssemblyBuilderAccess.RunAndCollect
  • @svick 在var builder = domain.DefineDynamicAssembly(...); 行抛出异常,我更新了问题。
  • @svick 我不希望在测试之间不共享的“假”程序集进入全局范围。虽然现在主要是出于纯度原因,但其中一些程序集可能稍后会包含一些代码,这可能是个问题。
  • 您还需要运行在其他应用程序域中创建程序集的代码。
  • @HansPassant 我担心会是这样。我会看看能做些什么,我可能会完全改变我的方法。感谢您的评论。

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


【解决方案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 中找到委托。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多