1

AssemblyName.CodeBase を設定すると、アセンブリが LoadFrom コンテキストに読み込まれますか?

私は一種のプラグインシステムに取り組んでいます。Type.GetType などを使用できるようにする必要があります。コードのどの場所でも、Type がプラグイン dll からのものかどうかを知る必要はありません。

私のプラグインは、私のアプリケーション (windows/web) の bin ディレクトリの下のフォルダー Plugins にあり、各プラグインは独自のフォルダーにあります。

プローブ パスをプラグイン (または bin;bin\Plugins for web) に設定しますが、プラグインはサブ フォルダーにあるため違いはありません。

そして、このようにプラグインをロードします

pluginInfo.EntryAssemblyName = new AssemblyName(myAssemblyName);

pluginInfo.EntryAssemblyName.CodeBase = assemblyPath;

pluginInfo.EntryAssembly = Assembly.Load(pluginInfo.EntryAssemblyName);

注: PluginInfo は、プラグインの状態を保持する単なるクラスです。

アセンブリ名 Assembly.Load の CodeBase プロパティを設定したため、プローブ パスになくてもアセンブリを見つけることができます。これは、アセンブリが既定のコンテキストまたはコンテキストからロードされることを意味しますか?

エントリ アセンブリの後で AssemblyResolve イベントが再度発生するのは正常ですか?

4

1 に答える 1

0

AssemblyName(string) .ctorを使用してプロパティ設定すると、 Assembly.Load(AssemblyName)がデフォルトのコンテキストでそれをロードすることをAssemblyName.CodeBase確認できません。最初にデフォルトのコンテキストでロードしようとしますが、これが失敗した場合は、コードベースを使用して LoadFrom コンテキストにロードします。詳細については、このテーマに関するSuzanne Cook のブログ エントリを参照してください。

アセンブリが既定のコンテキストで確実に読み込まれるようにするには、プロパティを設定せず、 System.IO.FileLoadExceptionに備えてください。オブジェクトが正常に構築された場合 (例外がスローされない場合)、アセンブリは既定のコンテキストに読み込まれています。AssemblyName.CodeBase

LoadFrom コンテキストの利点は、読み込まれたアセンブリの依存関係が同じパスに存在する場合に解決できることです。一方、既定のコンテキストに読み込まれたアセンブリは、GAC、AppDomain.BaseDirectoryまたは に存在する場合にのみ解決できますAppDomain.RelativeSearchPathAppDomain.AssemblyResolve読み込まれたアセンブリの依存関係がこれらの場所で見つからないため、このイベントが発生した可能性があります。

于 2013-03-29T14:06:02.730 に答える