2009-04-07 2 views
3

가져온 된 메서드를 사용할 때 ASP.NET은 Dll을로드하고 사용을 마친 후에도 파일을 잠그므로 DllImport 및 ASP.NET에 몇 가지 문제가 있습니다. ASP.NET에서 파일에 대한 잠금을 해제하도록 강제 할 수있는 방법이 있습니까?DllImport 및 ASP.NET

답변

2

.NET의 프로세스에서 DLL을 강제로 제거하는 유일한 방법은 Dll이로드 된 AppDomain을 언로드하는 것입니다. DllImport 코드를 실행하는 별도의 AppDomain을 만들지 않으면이 작업을 수행 할 수 없습니다.

또한이 정책이 관리되는 DLL에 적용된다는 것도 알고 있습니다. 이 DLL이 PINvoke를 통해로드 된 경우 100 % 확실하지 않지만 상당히 확신합니다.

+0

제게는 pinvoke가 추가 된 dll에서는 작동하지 않았습니다. dll에 따라 달라질 수 있습니다. – Sire

2

새 AppDomain을 만들고 dll을 도메인에로드하는 경우에만. 그런 다음 AppDomain을 언로드하면 dll이 언로드됩니다.

0

AppDomain을 언로드하는 것만이 유일한 대답은 아닙니다. pinvoke를 통해 LoadLibraryFreeLibrary을 사용하여 라이브러리를 언로드 할 수도 있습니다. FreeLibrary을 두 번 호출하여 라이브러리의 종속성도 언로드되도록해야합니다.

나는이 테스트를하지 않은,하지만이 같은 클래스가 일을 만들 것 상상이 쉽게 :

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern IntPtr LoadLibrary(string libname); 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private static extern bool FreeLibrary(IntPtr hModule); 

class LibraryHandle 
{ 
    readonly string libName; 
    int refCount = 0; 
    IntPtr handle; 

    public LibraryHandle(string name) 
    { 
     libName = name; 
    } 

    public void Increment() 
    { 
     if (refCount == 0) 
     { 
      handle = LoadLibrary(libName); 
      if (Handle == IntPtr.Zero) 
      { 
       int error = Marshal.GetLastWin32Error(); 
       throw new Exception(string.Format("{0})", error)); 
      } 
     } 
     ++refCount; 
    } 

    public void Decrement() 
    { 
     if (refCount <= 0) 
      return; 

     if (--refCount) 
     { 
      // It might be better in some cases to: 
      // while(FreeLibrary(handle)); 
      FreeLibrary(handle); 
      FreeLibrary(handle); 
     } 
    } 
} 

그냥이 예 당신이 원하는 것, 이는 안전 스레드되지 않는다는 경고 ASP.NET에서 보장하며 완전한 오류 검사를 수행하지 않습니다.

또한 런타임에 의한 일부 가정을 위반할 수 있으므로로드하지 않은 라이브러리에서 FreeLibrary을 사용하는 것은 좋은 생각이 아닙니다.

또 다른 방법은 새로운 AppDomain에서 어떤 작업을 수행 한 다음 완료하면 언로드하는 것입니다.

관련 문제