0

mvc3 アプリケーションがあります。アプリケーション プロジェクトに「Plugins」というサブフォルダがあります。

そのフォルダーに保存されているすべての dll は実行時に更新可能である必要があるため、appdomain を配置して新しいバージョンの dll をリロードします。そのため、すべてのプラグイン dll を別の appDomain にロードして、その shadowCopy プロパティを設定しようとしています。 .

SO、msdn、およびいくつかのブログを調べて、この「解決策」にたどり着きました。(これは Application_Start 中に呼び出されます)

static AppDomain pluginDomain;
static PluginHolder()
        {
            AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;
            domainSetup.ApplicationName = "Plugins";
            domainSetup.PrivateBinPathProbe = domainSetup.PrivateBinPath;
            domainSetup.PrivateBinPath = GetPluginsDirectory();
            domainSetup.ShadowCopyFiles = "true";
            domainSetup.ShadowCopyDirectories = domainSetup.PrivateBinPath;

            pluginDomain= AppDomain.CreateDomain("Plugins", null, domainSetup);
            var item = pluginDomain.Load(File.ReadAllBytes(GetPluginsDirectory() + "Item.dll"));
        }

「Item.dll」は、ロードしようとしている dll です。最後の行は、「ファイルまたはアセンブリ アイテム、またはその依存関係の 1 つを読み込めませんでした」をスローします。これは他の人が成功した方法のようですが、私にはうまくいきません。

私は AppDomains の経験がないので、この問題にどのようにアプローチするか、または正しく取り組んでいるかどうかわかりません。

新しい AppDomain を介してアセンブリをロードすることは問題ありませんか?

4

1 に答える 1

0

この種のエラー メッセージを解読するには、Assembly Binding Log Viewerを使用する必要があります。

また、 AppDomain.Load(byte[])のドキュメント ページの備考セクションにも注意してください。新しい AppDomain にアセンブリをロードする場合は、代わりにCreateInstanceAndUnwrapを使用する必要があります。

プラグイン エンジンを .NET に実装する場合は、AppDomains、アセンブリの解決と読み込みを理解し、異なる AppDomains のオブジェクト間の通信メカニズムを選択する必要があります。.NET と CLR に関する優れた書籍のほとんどには、AppDomains に関する章が 1 つか 2 つ含まれており、それらを読めばすぐに理解できます。クロス AppDomain 通信に関する限り、WCF または .NET Remoting ( MarshalByRefObject ) を使用できます。

幸運を。

于 2012-09-26T15:24:50.043 に答える