2009-08-04 45 views
1

我有一个应用程序,在DLL /文件上隐式打开句柄。在应用程序的某个时候,我想释放这个句柄。我该怎么做?我的应用程序是在C#中。如何通过C#释放句柄?

+0

什么有问题的文件是处理程序?它是资源还是引用程序集?你似乎知道为什么它被打开,这是它被用于什么时候以及什么时候被关闭的最大暗示。关心让我们进来? – 2009-08-04 06:36:04

+0

一切280Z28说...加上“影子副本”;-p – 2009-08-04 06:43:42

回答

4

使用PInvoke的,如果你有,你要关闭

[System.Runtime.InteropServices.DllImport("Kernel32")] 
private extern static Boolean CloseHandle(IntPtr handle); 
0

只需使用打开句柄的类的Dispose或Close方法即可。

0

我不知道一个简单的方法。过度的隐式文件锁定是我一直不喜欢Windows的东西。

如果您需要替换文件,MoveFileEx可以在下次启动时执行。您将使用它来重命名或删除原始文件,然后将其他文件重命名为它的位置。 http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html

如果你不想使用API​​惹直接有MoveFile中的Sysinternals Suite这不相同:http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

或者你可以有其他程序访问文件时,你的程序ISN”运行。

如果你真的想要关闭句柄,那么如果.NET试图再次访问它,这很可能会导致你的程序崩溃,有办法获得每个进程的句柄列表。这不是很好,例子是C++: http://www.codeguru.com/forum/showthread.php?t=176997

4

你究竟在做什么?如果你想加载一个程序集来完成一些东西,然后完全卸载它,你需要依靠创建一个新的应用程序域。

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

或者,如果你只担心 保持锁定了该文件,你可以使用 影子复制。这将在磁盘上复制文件 ,并从 加载新的位置。原始文件 将不会被该负载锁定。至 做到这一点,在创建AppDomain时设置为 将AppDomainSetup.ShadowCopyFiles设置为 ,或者在创建AppDomain时设置为 设置AppDomain.ShadowCopyFiles为true 。