가져온 된 메서드를 사용할 때 ASP.NET은 Dll을로드하고 사용을 마친 후에도 파일을 잠그므로 DllImport 및 ASP.NET에 몇 가지 문제가 있습니다. ASP.NET에서 파일에 대한 잠금을 해제하도록 강제 할 수있는 방법이 있습니까?DllImport 및 ASP.NET
3
A
답변
2
.NET의 프로세스에서 DLL을 강제로 제거하는 유일한 방법은 Dll이로드 된 AppDomain을 언로드하는 것입니다. DllImport 코드를 실행하는 별도의 AppDomain을 만들지 않으면이 작업을 수행 할 수 없습니다.
또한이 정책이 관리되는 DLL에 적용된다는 것도 알고 있습니다. 이 DLL이 PINvoke를 통해로드 된 경우 100 % 확실하지 않지만 상당히 확신합니다.
2
새 AppDomain을 만들고 dll을 도메인에로드하는 경우에만. 그런 다음 AppDomain을 언로드하면 dll이 언로드됩니다.
0
AppDomain을 언로드하는 것만이 유일한 대답은 아닙니다. pinvoke를 통해 LoadLibrary
및 FreeLibrary
을 사용하여 라이브러리를 언로드 할 수도 있습니다. 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
에서 어떤 작업을 수행 한 다음 완료하면 언로드하는 것입니다.
관련 문제
- 1. Asp.Net C# DllImport 문제
- 2. P/호출 [같이 DllImport] ASP.NET
- 3. DllImport StackOverflowException
- 4. DllImport 인스턴스 기간
- 5. dllimport 이해 및 키보드 후킹 사용 방법
- 6. __declspec (같이 DllImport/dllexport) 및 상속
- 7. DLLImport 오류 : Manifest 파일 및 C#
- 8. OS 플랫폼 기반 DllImport
- 9. VB.NET에서 DllImport vs Declare
- 10. CreateRemoteThread에서 DllImport 명령 실행
- 11. 같이 DllImport 방법은
- 12. Vista DLLImport 문제 C#
- 13. C# DllImport 반환 형식은 TCHAR입니까?
- 14. Visual C++에서 dllimport/dllexport 및 정적 라이브러리 컴파일
- 15. pinvoke : dllimport 및 가져온 라이브러리와 함께 작동하는 방법이 불확실합니다.
- 16. 같이 DllImport - .NET 유형 C 유형은
- 17. 의 GetDC() 64 애플 리케이션을위한 같이 DllImport
- 18. DLLImport -> C# 코드에서 핸들을 처리하는 방법
- 19. DLLImport Int ** - 수행 할 수있는 방법
- 20. char * 인수를 갖는 DLLImport. 한 문자 만 전달됩니다.
- 21. 어떻게 파일간에 C# DllImport 함수를 공유 할 수 있습니까?
- 22. 델파이 프리즘은 알 수없는 식별자 "같이 DllImport"오류
- 23. CUDA : 오류 C2491 : 'log1p': dllimport 함수 정의가 허용되지 않습니다.
- 24. VB.NET에서 <DllImport>이 다른 결과를 나타냄
- 25. GPL 라이센스 DLL을 가져 오면 .NET의 DLLImport 속성이 GPL을 위반합니까?
- 26. DLLImport get 보호 된 메모리를 읽거나 쓰려고 시도했습니다.
- 27. NAnt 및 ASP.NET 컴파일러
- 28. Autofac, ASP.NET 및 Microsoft.Practices.ServiceLocation
- 29. Asp.Net ListBox 및 JQuery
- 30. C# 및 ASP.NET MCQ
제게는 pinvoke가 추가 된 dll에서는 작동하지 않았습니다. dll에 따라 달라질 수 있습니다. – Sire