2016-05-04 12 views
0

MVCの下にCMSのようなアプリケーションを作成しています。別のAppDomainにASP.NET Web APIプラグインアセンブリをロード

プラグインのバックエンドコードを処理するにはWeb APIを使用するため、API DLLを/ binフォルダに置くと、特定のルート(/api/{namespace}/{controller}/{id})でプラグインサービスメソッドにアクセスできます。

新しいモジュールのインストール/アップグレード/削除の場合に、アセンブリを別の場所からロードしてからアンロードすることができます。

public class PluginAssembliesResolver : DefaultAssembliesResolver 
{ 
    public override ICollection<Assembly> GetAssemblies() 
    { 
     List<Assembly> assemblies = new List<Assembly>(base.GetAssemblies()); 

     foreach (string assemblyPath in ModuleManager.GetAllAssemblyPaths(HttpContext.Current.Server)) 
     { 
      if (File.Exists(assemblyPath)) 
      { 
       assemblies.Add(Assembly.LoadFrom(assemblyPath)); 
      } 
     } 

     return assemblies; 
    } 
} 

しかし、この場合には、私は現在のドメインにアセンブリをロードしていると私はそれらをアンロードすることはできませんよ。

人々は、プラグインのアセンブリを含めるようにDefaultAssembliesResolverをオーバーライドすることをお勧めします。別の場所からアセンブリをロードしようと

は(それは私のアセンブリを認識しますが、/binまたは/bin/myPluginフォルダの下に同じDLLを探すためにしようとします)エラーがスローされます:

AppDomain domain = AppDomain.CreateDomain("myDomain", null);  

Assembly assembly = Assembly.LoadFrom(@"C:\myPluginPath\myPlugin.dll"); 

domain.Load(assembly.GetName()); 

私は別々にロードすることができますどのようにAppDomain?

ありがとうございます。

答えて

0

お試しくださいdomain.Load(assembly.FullName())おそらくこれが役に立ちます。 私は同様のアプリケーションに興味があります。私はそれらを異なるアプリケーションドメインにロードして動作させる方法を見つけようとしています。 DLLをMicrosoft Addin Framework経由で読み込んでいますので、実行時に別のappDomainsにアドインを読み込んでアンロードすることができます。しかし、ASP WebAPIがマルチファイルのApplicationDomainsを処理できるかどうか、またその方法についてはわかりません。アプリケーションドメインは、2つのDLL間の通信を制限します。 1台のASP WebApiサーバーを使用しているか、作成していますか

+0

お返事ありがとうございます。 'assembly.FullName'は同じアセンブリの表示名を返すだけなので、これは無意味です。 私はまた、作業プロセス中にAppDomainsに関するいくつかの問題に精通しています。私の場合、ASP.NETはアプリケーションの起動時にのみASP.NETのロードとコンフィグレーションを行うため、アプリケーションを再起動せずに新しい拡張機能をインストールしてそのメソッド(この場合はAPIコントローラ/アクション)を使用することができません。とにかくありがとう、ありがとうございます。 –

1

DefaultHttpControllerSelectorを上書きする必要があります。 ここには非常に良い記事があります:link 希望の方は

関連する問題