2017-09-04 11 views
0

申し訳ありませんが、私は質問を正しく表現しているかどうかはわかりませんが、私の状況は... .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); 
     } 

    } 

答えて

0

そこに多くの可能な理由は、私が思うこの主な理由は、あなたの前のコンパイルからのDLLの一部を再コンパイルするときのプロセスに残っているし、全体のプロセスがあるまで、それは文句を言わないあなたがアクセス権を持たせ、あることができます終了しました(ある期間はロックされます)。 再コンパイルする場合は、フォルダを変更してみてください。それは動作するはずです。

+0

Hmm。私は2番目のフォルダを考慮しませんでした...それは2つのDLLが同じ名前とメソッドなどで読み込まれている問題を作成しませんか? – Quarty

+0

宛先フォルダが1の場合にのみ不平を言います – Vivek

関連する問題