【发布时间】: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