2012-11-20 33 views
4

我想在集成測試中動態創建程序集以測試某些程序集操作類。如果我用下面的代碼來創建測試組件:在非當前AppDomain上使用DefineDynamicAssembly動態創建程序集時出現異常

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。我在網上找到的主要內容都是關於在不同域中執行程序集。也許我在這裏想要做的只是太具體,太先進,甚至根本不推薦,但它可以使我測試所有的彙編操作代碼。

有人可以請指出我在正確的方向嗎?

+0

你能發佈引發異常的實際代碼嗎?爲什麼你不想將它加載到當前的AppDomain中?如果您擔心內存問題,則可以嘗試使用「AssemblyBuilderAccess.RunAndCollect」。 – svick

+0

@svick在'var builder = domain.DefineDynamicAssembly(...);'行拋出異常,我更新了這個問題。 – famousgarkin

+0

@svick我不想讓「假」程序集在測試之間共享以進入全局範圍。儘管目前它主要是出於純粹的原因,但其中一些程序集稍後可能會包含一些代碼,這可能是一個問題。 – famousgarkin

回答

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中查找委託。

相關問題