8

dll をロードしてクラス名などの情報を取得する必要があるタスクに取り組んでいますが、その dll をコードにロードするとロックされ、ソース コードからビルドできなくなります。読み込みプログラムを閉じます。特定の解決策を試しましたが、どれもうまくいきません

  1. シャドウコピー: この場合、アセンブリをシャドウ コピーすると、その後
    、メインの dll で何かを変更した場合、ロードしているアプリケーションではまだ古いものになります。

  2. System.Reflection.assembly.loadfrom(System.IO.GetBytes("asm-path")); //時々動作しますが、常に動作するとは限りません

  3. System.Reflection.assembly.ReflectionOnlyConext(); //動作しません

これに対する適切な解決策はありますか

4

2 に答える 2

25

1 つの方法は、ファイルのバイトを読み取り、2 番目の例で行っているのと同様のバイト配列を受け取る Assembly.Load のオーバーロードを使用することです。よくわかりませんが、代わりにSystem.IO.GetBytes試してみてください。File.ReadAllBytes

byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = Assembly.Load(assemblyBytes);

ただし、アセンブリがロードされた後にアセンブリをアンロードできないため、何をしたいかによってはこれでは不十分な場合があります。これを回避するには、必要に応じて、アセンブリを独自のAppDomainに読み込み、作業が終了したら AppDomain をアンロードします。

AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD");
byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = ad.Load(assemblyBytes);  

オブジェクトの処理が完了したらassembly、AppDomain をアンロードできます。

AppDomain.Unload(ad);
于 2013-09-21T18:17:18.243 に答える