내 응용 프로그램에 .dll 참조를 사용하고 있습니다. 단추 클릭 이벤트에서 .dll을 언로드하려고합니다. 어떻게하는가 ???C#을 사용하여 .dll을 언로드하는 방법은 무엇입니까?
답변
개별 어셈블리를 언로드 할 수 없습니다. 전체 AppDomain
을 언로드해야합니다. 즉, 다른 어셈블리 (및 관련 코드)를 새 AppDomain
에로드해야하며 언로드 할 때 AppDomain
을 언로드해야합니다.
물론 AppDomains 간의 호출을 마샬링하는 것에 대해 걱정할 필요가 있기 때문에 인생이 훨씬 어려워집니다.
Jon Skeet이 쓴 것처럼 DLL을 언로드 할 수 없지만 다른 AppDomain에서 DLL을로드 한 다음 AppDomain을 언로드 할 수 있습니다. 그게 유일한 방법입니다.
그러나 AppDomain에서 자연스럽게 함수를 호출해야하기 때문에 다양해야합니다. 이것은 두 가지 다른 방식으로 발생할 수 있습니다.
하나의 AppDomain (A라고 부름)에서 AppDomain B에서 인스턴스화 된 개체에 대한 참조를 얻으면 기본적으로 AppDomain 경계를 통해 개체가 serialize됩니다. 즉, A가 액세스하는 객체 인스턴스는 B가 액세스하는 인스턴스가 아니며 객체에서 다시 전송할 기능을 제공하지 않으면 A에서 수정 한 내용이 B에 반영되지 않습니다. 이를 위해서는 객체가 Serializable으로 표시되어야합니다.
그러나 클래스가 MarshalByRefObject에서 상속되도록함으로써 직렬화를 피할 수 있습니다. 개체가 AppDomain B에서 생성되고 AppDomain A에서 호출되면 호출은 AppDomain 경계를 넘습니다. 여전히 동일한 물리적 스레드이므로 교차 프로세스 호출이나 COM 교차 아파트 호출 에서처럼 스레드 전환의 오버 헤드가 없습니다.
그러나 A에서 개체가 참조하는 B에서 개체를 구성했지만 B의 개체가 5 분 동안 액세스되지 않으면 개체가 삭제됩니다. 이 동작은 MarshalByRefObject.InitializeLifetimeService()에서 재정의 할 수 있습니다.
Implementing .NET plug-ins without AppDomains에 대한 답변도 참조하십시오. 주석에서 메모리가 매우 천천히 누수된다고 지적한 토론을 주목하십시오.
- 1. 자바에서 DLL을 언로드하는 방법은 무엇입니까?
- 2. C에서 C++ DLL을 언로드하는 방법
- 3. MEF 재구성 후 삭제하기 위해 DLL을 언로드하는 방법은 무엇입니까? MEF와
- 4. GAC에서 어셈블리를 언로드하는 방법은 무엇입니까?
- 5. 캐시에서 파일을 언로드하는 방법은 무엇입니까?
- 6. nib에서로드 한보기 컨트롤러를 완전히 언로드하는 방법은 무엇입니까?
- 7. C#을 사용하여 AppDomain을 제대로 언로드하는 방법은 무엇입니까?
- 8. System.load (dll 경로)에 의해로드 된 dll을 언로드하는 방법
- 9. 이미로드 된 클래스를 Java에서 언로드하는 방법은 무엇입니까?
- 10. UINavigationController가 터지면 UITabBarController를 언로드하는 방법은 무엇입니까?
- 11. 팝업 된보기 컨트롤러를 언로드하는 방법은 무엇입니까?
- 12. py2exe를 사용하여 dll을 추가하는 방법은 무엇입니까?
- 13. dll을 보호하는 방법은 무엇입니까?
- 14. GAC에 DLL을 등록하는 방법은 무엇입니까?
- 15. 런타임시 DLL을 참조하는 방법은 무엇입니까?
- 16. sharepoint에 dll을 등록하는 방법은 무엇입니까?
- 17. dll을 Simulink에 연결하는 방법은 무엇입니까?
- 18. 언어 DLL을 테스트하는 방법은 무엇입니까?
- 19. 리플렉션 작업을 위해 .NET 어셈블리를로드 한 다음 언로드하는 방법은 무엇입니까?
- 20. C/C을 찾고 ++ 언어와 표준 라이브러리 사양
- 21. ROWID 데이터 유형이있는 필드가있는 테이블을 언로드하는 방법은 무엇입니까?
- 22. Javascript 플러그인을 동적으로로드하고 언로드하는 가장 효율적인 방법은 무엇입니까?
- 23. Windows에서 등록 된 dll을 확인하는 방법은 무엇입니까?
- 24. Python DLL을 사용하여 Python 스크립트를 실행하는 방법은 무엇입니까?
- 25. C# 응용 프로그램을 사용하여 DLL을 재배포하는 방법은 무엇입니까?
- 26. Delphi에서 "_pascal calling convention"을 사용하여 dll을 호출하는 방법은 무엇입니까?
- 27. C# dll을 사용하여 C++ DLL을 호출해야합니까?
- 28. Cocos2d에서 이미지를 언로드하는 방법
- 29. 빈에서 어셈블리를 언로드하는 ASP.NET
- 30. JW-Player - 언로드하는 방법?
이것은 작업 관리자에서 응용 프로그램을 종료해야 응용 프로그램을 종료 할 수 있기 때문에 배경 화면입니다. 그런 응용 프로그램을 죽인 후에도 .dll은 언로드되지 않습니다. 그래서 내가 강제로 언로 드하길 원합니다. 다른 방법은 무엇입니까? – Anuya
프로세스가 사라진 경우 DLL에 보유되어서는 안됩니다. 다른 프로세스가 아니라고 확신합니까? SysInternals 도구를 사용하여 확인하십시오. –
martialling -> marshalling? 사실, 앱 도메인간에 정렬 될 수있는 유형/인스턴스에 대한 제한이 있다고 생각합니다. –