우리의 응용 프로그램은 일부 모듈을로드하는 AppDomain을 설정합니다. 이러한 모듈 중 하나는 H5 파일과 상호 작용하기 위해 레거시 혼합 모드 DLL을 사용하고 있습니다. 문제는 혼합 모드 DLL을로드하자마자 핸들이 새 AppDomain과 응용 프로그램이 시작될 때 만들어 졌던 원래 AppDomain 모두에 배치된다는 것입니다.모든 모드로로드 된 혼합 모드 어셈블리
새 AppDomain의 핸들은 AppDomain을 언로드 할 때 자연스럽게 사라지지만 원래 AppDomain의 핸들은 유지되고 고정됩니다. 이로 인해 관리되는 힙이 조각납니다.
이 동작을 설명하는 혼합 모드 소스 코드에서 아무 것도 찾을 수 없습니다. H5Utils::errorStack_.c_str()
네이티브 정적 문자열입니다
H5Utils::throwError(String^ message) {
String^ stackStr = gcnew String(H5Utils::errorStack_.c_str());
String^ myMessage = message + "\n\nError stack: " + stackStr;
throw gcnew H5IOError(myMessage);
}
: 의심스러운있는 유일한 방법은 기본 정적 문자열을 사용하는 다음 호출입니다. 그러나이 메서드는 절대로 호출되지 않으며 모듈은 혼합 모드 DLL이로드 될 때 즉시 두 AppDomains에로드됩니다.
핸들이 두 AppDomains에서 모두 생성되는 이유를 알고 있습니까?
글쎄, 그렇지 않아. ! gchandles 명령 [SOS 디버거 확장] (http://msdn.microsoft.com/en-us/library/bb190764%28v=vs.110%29.aspx)이 필요합니다. 그것. –
감사합니다. 그러나 이것이 어떻게 도움이 될지 모르겠습니다. 나는 이미 누출 된 손잡이가 있다는 것을 알고있다. 이 문제가 발생하는 이유는 원래 AppDomain과 내가 만든 혼합 모드 모듈을로드하기 위해 만든 AppDomain에서 핸들이 설정되는 이유입니다. –
이 핸들이 살아있는 개체의 유형을 모르는 경우 그것이 어디서 그리고 왜 만들어 졌는지 알 수 없습니다. –