申し訳ありませんが、私は質問を正しく表現しているかどうかはわかりませんが、私の状況は... .NET 4.6 with MEFを使用しています。C#MVCでMEFを使用するアセンブリいくつかのDLLをロードするにはどうすればアンロードできますか?
私は実行時にDLL用のモジュールフォルダをチェックし、それらをコンポジションコンテナ/ MEFにプルするコアWebサイトを持っています。これは私のコアでサードパーティプロジェクトのビュー/コントローラを使用できるようにします。
強いタイピングを可能にするために、私はthis guideに従って、PreApplicationStartMethodでDLLのシャドウコピーを作成するように提案しました。
これまでの作業はすべて本当に素晴らしいです。
問題は、デバッグをやめたり、サーバーを再コンパイルしたときに発生します。 DLLが適切にリリースされていないので、2回目にアクセス拒否エラーが発生します。 DLLをシャドウコピーフォルダにコピーしようとすると、エラーが発生します。
The process cannot access the file '....dll' because it is being used by another process.
私はそれがでファイルをロックしているBuildManager.AddReferencedAssembly(assemblyDll)だと思う...しかし、クラッシュまたは開始までのいずれかのアセンブリをアンロードするための信頼できる方法はありますか?
static PreApplicationInit()
{
PluginFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/Modules"));
ShadowCopyFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/Modules/temp"));
}
public static void Initialize()
{
Directory.CreateDirectory(ShadowCopyFolder.FullName);
//clear out plugins)
foreach (var f in ShadowCopyFolder.GetFiles("*.dll", SearchOption.AllDirectories))
{
f.Delete(); // -- Breaks here
}
//shadow copy files
foreach (var plug in PluginFolder.GetFiles("*.dll", SearchOption.AllDirectories))
{
var di = Directory.CreateDirectory(Path.Combine(ShadowCopyFolder.FullName, plug.Directory.Name));
File.Copy(plug.FullName, Path.Combine(di.FullName, plug.Name), true); // -- Or if Delete is Try Caught, Breaks here
}
foreach (var a in
ShadowCopyFolder
.GetFiles("*.dll", SearchOption.AllDirectories)
.Select(x => AssemblyName.GetAssemblyName(x.FullName))
.Select(x => Assembly.Load(x.FullName)))
{
BuildManager.AddReferencedAssembly(a);
}
}
Hmm。私は2番目のフォルダを考慮しませんでした...それは2つのDLLが同じ名前とメソッドなどで読み込まれている問題を作成しませんか? – Quarty
宛先フォルダが1の場合にのみ不平を言います – Vivek