0

アセンブリを指定すると、依存関係アセンブリのリストを生成するライブラリを作成しています-依存関係の依存関係を含みます。意図した使用シナリオには、主にマネージ コード (.NET) アセンブリが含まれます。

この依存関係リストを計算するための私のアプローチは次のとおりです。

  • 一時的な AppDomain を作成する ( code )
  • その AppDomain にヘルパー クラスのインスタンスを作成します ( code )
  • そのヘルパーに最初のアセンブリをフィードします: 依存関係ツリーのルート ( code )
  • 一時的な AppDomain のリフレクションのみのコンテキスト ( code )で検査のためにそのアセンブリを読み込みます
  • 依存関係を再帰的に追跡する

このヘルパー クラスは、 .NET アセンブリのみを参照するアセンブリで定義されていることに注意してください。他には何もありません。メイン ライブラリのアセンブリには、アセンブリへの参照があります。 System.Reactive

一時的な AppDomain にはこれらのアセンブリが読み込まれていないことが予想されますが、そうでないことを示唆するエラーが表示されます。System.Reactive

API restriction: The assembly 'file:///X:\some-path\System.Reactive.Linq.dll' has already loaded from a different location. It cannot be loaded from a new location within the same appdomain.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.ReflectionOnlyLoadFrom(String assemblyFile)
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoadFromAssemblyPath(AssemblyName assembly, FileNotFoundException originalException) in DependencyResolver\DependencyResolver.AppDomainHelper\Util\AssemblyLoader.cs:line 96
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoad(AssemblyName assembly) in DependencyResolver\DependencyResolver.AppDomainHelper\Util\AssemblyLoader.cs:line 67
   at DependencyResolver.AppDomainHelper.Util.AssemblyLoader.ReflectionOnlyLoad(AssemblyName assembly)
   at DependencyResolver.Resolver.GetAllDependenciesRecursive(AssemblyName start, Func`2 filter, Func`2 preProcess, Action`1 postProcess) in DependencyResolver\DependencyResolver\Resolver.cs:line 39
   at DependencyResolver.Resolver.<>c__DisplayClass6.<GetAllDependenciesRecursive>b__5(AssemblyName an) in DependencyResolver\DependencyResolver\Resolver.cs:line 51
   at System.Reactive.Linq.Observαble.Select`2._.OnNext(TSource value)

これは、異なるバージョンの を含むアセンブリの山でライブラリを使用すると発生しますSystem.Reactive.Linq.dll

一時的な AppDomain が必要のないものを読み込まないようにするにはどうすればよいですか?

4

1 に答える 1

0

1 つの方法は、 AssemblyResolveイベントをサブスクライブしAppDomainてメソッドを実行することでしょうか? この方法では、アセンブリを解決できない場合、イベント ハンドラーが呼び出されてアセンブリが読み込まれます。ここでの唯一の問題は、ファイル名が同じで厳密な名前が異なるアセンブリがある場合です。

別の方法として、すべてのアセンブリを のベース ディレクトリに配置してAppDomainから、単純にメソッドを呼び出す方法があります。その後、ロードされたアセンブリを に検査しAppDomainます。CLRが各アセンブリを遅延してロードすることを考えると、これにより、探しているリストが得られるはずです。ファイル名が同じで厳密な名前が異なるアセンブリがある場合は、いつでもプライベート ビン パスを使用できます。

同じファイル名の「弱い名前の」アセンブリがある場合、問題が発生することに注意してください。

于 2013-09-18T18:30:01.303 に答える