簡體   English   中英

在C#MVC中使用MEF,程序集正在加載一些DLL,如何卸載它們?

[英]Using MEF in C# MVC, Assembly Loading some DLLs, how do I unload them?

預先抱歉,我不確定我是否正確表達了這個問題,這是我的情況...在MEF中使用.NET 4.6。

我有一個核心網站,該網站在運行時檢查DLL的模塊文件夾,並將其拉入Composition Container / MEF組件中,這使我可以在核心中使用第三方項目的視圖/控制器。

為了進行強類型輸入,我遵循了該指南該指南建議在PreApplicationStartMethod中制作DLL的卷影副本。

到目前為止一切正常,真的很棒。

當我停止調試或服務器重新編譯時,就會出現問題。 DLL沒有被正確釋放,因此第二次出現訪問拒絕錯誤。 當我嘗試將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);
        }

    }

可能有很多可能的原因,但是我認為主要原因是,當您從以前的編譯中重新編譯某些dll時,它仍在處理中,直到整個過程完成后,它才允許您訪問(這總之是將有一個鎖)。 如果要重新編譯,請嘗試更改文件夾。 它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM