繁体   English   中英

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

[英]Delete DLL after closing c# application

我有包含各种 esternal DLL 的 ac# 应用程序。 应用程序启动时,会在 .exe 文件夹中提取 dll 以确保正确执行。 这里的代码:

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,您会在之后加载并使用它们。

动态加载 DLL 有一个小问题,因为您不能只是卸载它们。 一旦加载到您的应用程序域中,它们就会留下来。

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

就像是:

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

// do stuff with your dynamically loaded assembly

AppDomain.Unload(dynamicDomain);

有关该主题的更多信息: MSDN“如何:加载和卸载程序集”

您可以(并且应该)围绕您在系统上操作文件的部分实施异常处理:

try
{
  // Manipulate your files here.
}
catch (Exception ex)
{
  // Handle exceptions here. you can also delete the dlls here if you wish.
  // Remember to check in CleanFiles if the files are already deleted.
}
finally
{
  // You could also get rid of the files here.
  // Finally-block is executed regardless if an exception was thrown or not.
}

有用的链接: 微软:异常处理微软:异常的最佳实践

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM