Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭c应用程序后删除DLL_C#_Dispose - Fatal编程技术网

C# 关闭c应用程序后删除DLL

C# 关闭c应用程序后删除DLL,c#,dispose,C#,Dispose,我有一个c应用程序,其中包括各种esternal DLL。当应用程序启动时,DLL在.exe文件夹中被解压缩,以允许正确执行。 代码如下: var executingAssembly = Assembly.GetExecutingAssembly(); string folderName = string.Format("{0}.Resources.DLLs", executingAssembly.GetName().Name); var list = executingAssembly .G

我有一个c应用程序,其中包括各种esternal DLL。当应用程序启动时,DLL在.exe文件夹中被解压缩,以允许正确执行。 代码如下:

var executingAssembly = Assembly.GetExecutingAssembly();

string folderName = string.Format("{0}.Resources.DLLs", executingAssembly.GetName().Name);
var list = executingAssembly
.GetManifestResourceNames()
.ToArray();
foreach (var item in list)
{
    File.WriteAllBytes(item.Replace("myapp.DLLs.", ""), 
    ReadAllBytes(executingAssembly.GetManifestResourceStream(item)));
}
关闭表单时,我希望删除与表单关闭事件关联的具有以下代码的文件:

private void CleanFiles(Object sender, FormClosingEventArgs e)
{
    var executingAssembly = Assembly.GetExecutingAssembly();
    string folderName = string.Format("{0}.Resources.DLLs", executingAssembly.GetName().Name);
    string folder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    var list = executingAssembly
    .GetManifestResourceNames()
    .ToArray();
    foreach (var item in list)
    {

        File.Delete(folder + @"\" + item.Replace("myapp.DLLs.", ""));
    }
}
如果我打开然后关闭窗体,它会工作得很好。但是,如果我打开表单,执行一些操作,它会在关闭操作期间引发异常,因为对DLL的访问被拒绝。
如何释放所有DLL/资源

您可以而且应该在系统上操作文件的部件周围实施异常处理:

尝试 { //在这里操作您的文件。 } 捕获异常 { //在此处处理异常。如果愿意,也可以在此处删除DLL。 //如果文件已被删除,请记住签入CleanFiles。 } 最后 { //你也可以把这里的文件处理掉。 //最后,无论是否引发异常,都会执行块。 }
有用链接:,

我假设如果您复制这些DLL,您将在以后加载并使用它们

动态加载DLL有一个小问题,那就是您不能仅仅卸载它们。一旦加载到您的应用程序域中,它们就会留在这里

因此,解决方案是简单地创建一个新的应用程序域,在其中加载DLL,完成后卸载这个新的应用程序域

比如:

var dynamicDomain = AppDomain.CreateDomain("YourDomainName");
var dynamicallyLoadedAssembly = dynamicDomain.Load("YourAssembly");

// do stuff with your dynamically loaded assembly

AppDomain.Unload(dynamicDomain);

有关此主题的更多信息:.

我不会从使用DLL的进程中删除DLL,而是启动另一个进程,该进程的工作不只是删除文件。虽然没有错,但它实际上没有回答问题。这捕获了异常,但是解决不了问题。我不知道哪里解决不了问题?当抛出异常时,他无法删除文件。捕获异常,删除文件,解决问题。还是我理解错了什么?英语不是我的母语,如果我误解了这个问题,很抱歉。不:如果他试图在catch或finally块中删除该文件,他将再次遇到相同的异常。如果该文件正在使用中,您会收到一个错误,说我无法删除该文件,因为该文件正在使用中,然后忽略错误并重试只会产生相同的结果。。。这个错误。