문제

DLL/파일의 핸들을 암시 적으로 엽니 다. 응용 프로그램의 어느 시점 에서이 핸들을 해제하고 싶습니다. 어떻게하니? 내 응용 프로그램은 C#입니다.

도움이 되었습니까?

해결책

닫으려는 핸들러가있는 경우 Pinvoke를 사용하십시오.

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

다른 팁

정확히 무엇을하려고합니까? 어셈블리를로드하여 그 작업을 수행 한 다음 완전히 내리려면 새 앱 도메인을 만드는 데 의존해야합니다.

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을 작성하거나 AppDomain.shadowCopyFiles를 이미 작성한 후 TRUE로 설정할 때 "True"로 설정하십시오.

손잡이를 열었던 클래스의 처분 방법 또는 가까운 방법 만 사용하십시오.

나는 쉬운 방법을 모른다. 과도한 암시 적 파일 잠금은 내가 항상 Windows에 대해 싫어하는 것입니다.

파일을 교체 해야하는 경우 다음 부팅에서 MoveFileEx가 파일을 수행 할 수 있습니다. 원본 이름을 바꾸거나 삭제 한 다음 다른 이름을 그 자리로 바꾸는 데 사용합니다.http://msdn.microsoft.com/en-us/library/aa365240(vs.85).aspx http://www.pinvoke.net/default.aspx/kernel32/movefileex.html

API를 직접 엉망으로 만들고 싶지 않다면 Sysinternals Suite에 동일하게 수행되는 MoveFile이 있습니다. http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

또는 프로그램이 실행되지 않을 때 다른 프로그램에 파일에 액세스 할 수 있습니다.

프로세스 당 핸들 목록을 얻는 방법이 있습니다. 실제로 핸들을 닫으려고한다면 .NET이 다시 액세스하려고 할 경우 프로그램이 충돌 할 가능성이 높습니다. 예쁘지 않고 예제는 C ++입니다.http://www.codeguru.com/forum/showthread.php?t=176997

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top