如何通过C#释放句柄?

时间:2009-08-04 06:33:26

标签: c# handle filehandle

我有一个IMPLICITLY打开dll /文件句柄的应用程序。在应用程序的某个时刻,我想释放这个句柄。我该怎么做?我的申请是在C#。

4 个答案:

答案 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