2016-12-20 6 views
0

私は、クラウドストレージからアセンブリをダウンロードし、Activator.CreateInstanceを使用してそのインスタンスを作成し、そのメソッドを呼び出します。AssemblyResolveイベントが、AppDomainに既に読み込まれているアセンブリを解決しようとしているのはなぜですか?

正常に動作する依存関係をダウンロードするためにAssemblyResolveメソッドをセットアップしましたが、テスト/テストするためにアセンブリを手動でダウンロードしようとしています。私は、私が呼び出していたときにどの後、私は、彼らはしかし

AppDomain.CurrentDomain.GetAssemblies()) 

経由のAppDomainにロードされて見ることができます

Assembly.Load(byte[]) 

を使用してそれらをロードし、それらをダウンロードして、限り発見としての依存性が必要とされる持っていますこれを参照するアセンブリのメソッド、それはまだAssemblyResolverに行きます。

ロードされたアセンブリとAppDomainの動作を誤解しているかもしれませんが、一度アセンブリをロードすると、このアセンブリで使用できるようになり、解決する必要はありません。

なぜ「見る」ことができないのですか?バージョンと名前などは同じです。

私は異なるアセンブリバインディングコンテキストhereについて読んだことがあります。これは問題になると思いますか? Assembly.Load(string)を使用するとAssembly.Load(byte)とは異なるコンテキストにロードされることが示唆されていますか?どのようにすれば、私はアセンブリのメモリをbyte []として扱うだけですか?それは正しいコンテキストにロードされていないとしてあなたは、あなたが読み込まれたアセンブリから直接タイプを取得する必要が

おかげ

+0

Assembly.Load(..)を例外なく使用していてもアセンブリを読み込めませんか? – Redhead

+0

アセンブリーにasseblyが選択されてロードされた後、Visual Studioで 'Debug-> Widnows-> Modules'画面のスクリーンショットを表示できますか? –

+0

タイプをロードする方法、メソッドを取得して実行する方法を示すコードを追加してください。私は問題が何であるかを知るために推測しました;-) –

答えて

0

。上記のコードで

var assembly = Assembly.Load(File.ReadAllBytes(some_path)); 

// This will work. Note that you don't need the assembly-qualified name, 
// as you are asking the assembly directly for the type. 
var type1 = assembly.GetType("My.Special.Type"); 

// This will not work - the assembly "My.Assembly" is not loaded into 
// the Load context, so the type is not available. 
var type2 = Type.GetType("My.Special.Type, My.Assembly"); 

type1は、型への参照を持っていますが、アセンブリは通常の負荷状況にロードされていないとしてtype2は、nullになります。

+0

これは実際に実行しているアセンブリで行っていることですが、問題はAssembly.Load(byte [])でロードした依存関係は明らかにできませんこの型からメソッドを実行すると、必要なアセンブリが既にAppDomainに読み込まれていても、AssemblyResolveイベントがトリガーされます。 – Tom

関連する問題