9

テストのためだけに c# 4.0 とコンソール アプリケーションを使用していますが、次のコードでは例外が発生します。

AppDomainSetup appSetup = new AppDomainSetup()
{
    ApplicationName = "PluginsDomain",
    ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
    PrivateBinPath = @"Plugins",
    ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
};

AppDomain appDomain = AppDomain.CreateDomain("PluginsDomain", null, appSetup);

AssemblyName assemblyName = AssemblyName.GetAssemblyName(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins", "sample.dll"));

Assembly assembly = appDomain.Load(assemblyName); //This gives an exception of File not found

AppDomain.Unload(appDomain);

作成した AppDomain でLoadを使用すると、File not found 例外が発生し続けます。

ありがとう。

4

3 に答える 3

10

まず、プラグインがAppDomainベースパスのサブディレクトリであることを確認します。ここでPrivateBinPath説明されているように、サブディレクトリでのみ機能します

それが問題ではない場合は、フュージョンバインディングログを確認してください。フュージョンログビューアを使用するその上に良いブログ投稿もあります。フュージョンログは、アセンブリを検索した場所を示します。パスが検索に含まれているかどうかがわかります。

他の可能性の1つは、アセンブリを検出しているが、依存関係の1つを検出していないことです。ここでも、フュージョンログビューアが教えてくれます。

于 2011-07-08T20:00:14.777 に答える
6

これが発生する理由を理解したと思います。これは、別のアプリ ドメインにアセンブリをロードしている場合でも、現在のドメインもアセンブリをロードする必要があるためです。現在のドメインはそれを認識してロードする必要があります。 .NET が設計されました。

詳細はこちらをご覧ください。

http://msdn.microsoft.com/en-us/library/36az8x58.aspx

Fusion ログを確認したところ、新しく作成されたアプリ ドメインがプライベート ビン パスからアセンブリを正常に読み込めたことがわかりました。また、「ファイルが見つかりません」という例外が引き続き発生する理由は、この例外が元々属していたためです。現在のアプリ ドメインに。

つまり、アセンブリを現在のアプリケーション パスまたは現在のドメインがプローブしているパスにコピーした場合、アセンブリをカスタム ドメインにロードできることがわかります。

それが役立つことを願っています。

于 2011-07-12T00:20:52.647 に答える