6

いくつかのアセンブリ操作クラスをテストする目的で、統合テストでアセンブリを動的に作成したいと考えています。次のコードを使用してテスト アセンブリを作成するとします。

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' は、シリアル化可能としてマークされていません。

DefineDynamicAssemblyこれが非 current の呼び出しにどのように関連するかはわかりませんAppDomain。私がオンラインで見つけたのは、主に別々のドメインでアセンブリを実行することだけです。ここでやろうとしていることは、具体的すぎるか、高度すぎるか、またはまったく推奨されていないだけかもしれませんが、アセンブリ操作コードをすべてテストすることができます。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

提案されたように、他のAppDomainでコードを実行することで機能しました。

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);
});

他の AppDomain でデリゲートを見つけるには、AppDomainSetup で ApplicationBase を指定する必要があることに注意してください。

于 2013-02-20T15:05:54.367 に答える