[英]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.