我有一个IMPLICITLY打开dll /文件句柄的应用程序。在应用程序的某个时刻,我想释放这个句柄。我该怎么做?我的申请是在C#。
答案 0 :(得分:4)
你到底想要做什么?如果你想加载一个程序集来做一些东西,然后完全卸载它,你需要依赖于创建一个新的app域。
public static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("NewAppDomain");
appDomain.DoCallBack(new CrossAppDomainDelegate(AsmLoad));
// At this point, your assembly is locked, you can't delete
AppDomain.Unload(appDomain);
Console.WriteLine("AppDomain unloaded");
//You've completely unloaded your assembly. Now if you want, you can delete the same
}
public static void AsmLoad()
{
Assembly assembly = Assembly.LoadFrom(@"c:\Yourassembly.dll");
//Loaded to the new app domain. You can do some stuff here
Console.WriteLine("Assembly loaded in {0}",AppDomain.CurrentDomain.FriendlyName);
}
请查看此帖子了解更多信息,http://blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx
或者,如果你只是担心 保持文件锁定,你可以使用 影子复制。那会复制一份 磁盘上的文件并加载它 新的位置。原始文件 不会被那个负载锁定。至 做那个,设定 AppDomainSetup.ShadowCopyFiles到 创建AppDomain时的“true”或 将AppDomain.ShadowCopyFiles设置为true 在它已经被创建之后。
答案 1 :(得分:4)
如果您有要关闭的处理程序,请使用PInvoke
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
答案 2 :(得分:0)
只需使用打开句柄的类的Dispose或Close方法。
答案 3 :(得分:0)
我不知道一个简单的方法。过度的隐式文件锁定是我一直不喜欢的Windows。
如果您需要更换文件,MoveFileEx可以在下次启动时执行此操作。您可以使用它来重命名或删除原始内容,然后将其他内容重命名为其位置。 http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html
如果您不想直接使用API,那么SysInternals套件中的MoveFile会执行相同操作:http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx
或者,当程序未运行时,您可以让另一个程序访问该文件。
如果你真的想要尝试关闭句柄,那么有办法获得每个进程的句柄列表,如果.NET试图再次访问它,很可能会崩溃你的程序。它不漂亮,例子是C ++: http://www.codeguru.com/forum/showthread.php?t=176997