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