2012-02-25 4 views
2

성능상의 이유로 어셈블리를 GAC에 넣으려고합니다. AssemblyResolve 이벤트에 바인딩되는 코드가 있습니다. 그러나 내 어셈블리를 GAC'ing하기 때문에 AssemblyResolve 이벤트 처리기가 더 이상 충돌의 원인을 내 GAC 어셈블리에서 가져 오지 않습니다.어셈블리 어셈블리 GAC의 어셈블리에 대한

즉, 내 GAC의 어셈블리에는 XYZ.dll에 대한 참조가 있습니다. 별도로 재배포하는 대신 내 GAC의 어셈블리에는 XYZ.dll이 시작시로드되는 임베디드 리소스로 저장되어 있습니다. 어셈블리 확인 처리기는 XYZ.dll의 동적으로로드 된 인스턴스를 반환합니다. 그러나, 내 어셈블리가 GAC가되었으므로 AssemblyResolve 이벤트는 XYZ.dll에 대해 전혀 실행되지 않습니다.

로드 컨텍스트가 다른 것과 관련이 있다고 추측합니다 ... 그러나 어떻게 처리해야할지 모르겠습니다. 내 어셈블리가 GAC되었으므로 이제 어떻게 해결할 수 있습니까?

+0

이것은 자신을 파헤 치기에 매우 복잡한 구멍처럼 들립니다. 왜 당신은 의존성을로드하기 위해'AssemblyResolve' 이벤트를 선택 했습니까? 종속성이 표준 CLR 어셈블리 대신 포함 된 리소스 인 이유는 무엇입니까? –

+0

GAC에도 XYZ.dll이 있습니까? 어셈블리 및 XYZ.dll을로드해야하는 프로세스에 연결하고로드 된 위치를 확인합니다. –

+0

@ProgrammingHero 어셈블리를 병합하려고하지만 ILMerge를 사용하거나 사용하지 않으려는 경우 이러한 종류의 표준. http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx –

답변

3

물론이 기능은 작동하지 않습니다. GAC는 DLL Hell 대응책으로 DLL의 특정 버전을 사용하는 모든 응용 프로그램이 요청한 특정 버전의 DLL을 가져옵니다. 일관되게, 어떤 프로세스가 그것을 요구했는지에 상관없이. 프로세스의 프로빙 경로에서 GAC-ed DLL의 종속성을 해결하면 최악의 방법으로 DLL 지옥을 다시 가져올 수 있습니다. GAC가 제공하는 보증을 완전히 무효화하면 DLL은 이 아니며은 일관되게 작동하도록 신뢰할 수 있습니다.

이것은 미묘하지는 않지만 기본적으로 무서운 시나리오는 GAC-ed의 어셈블리에 정의 된 파생 클래스의 기본 클래스가 종속 어셈블리에 정의되어있는 경우입니다. 당신이 일하기를 희망한다면 은 완전히 다른 기본 클래스 구현을 허용 할 것입니다. 기본 클래스가 너무 다르지 않은 경우 지터가 넘어지지 않는다는 합리적인 확률이 있습니다. 런타임시의 실제 결과는 매우 비참합니다. 특히 디버거가없는 사용자의 경우, 잘못된 코드가 몇 가지 방법으로 이유를 진단하여 실행됩니다. DLL 지옥은 사용자의 악몽입니다. ​​문제를 진단하고 수정할 수있는 사람이 희생자입니다.

CLR은 사용자가이 방법으로 발을 쏘게하는 것을 절대 거부합니다. 예, 로딩 컨텍스트가 핵심입니다. Fusion이 기본 API입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 GAC가 dll에 대한 강력한 대응책이라고 말하지 않을 것이다. 그것은 단지 그것의 또 다른 형태입니다. 나는이 경로를 가고 싶다면 GAC에도 다른 DLL을 배치해야 할 것 같다. – Jeff

+0

글쎄요, 그래, GAC는 당신이 * DLL Hell을 의도적으로 원할 때 방해가된다. –

+0

내가 정말로 원했던 것은 단지 1 개에 반하여 15 개의 DLL을 재배포해야했던 방법이었습니다. 제 고객은 수백만 dll과 의존성이 아닌 블랙 박스를 원했습니다. – Jeff

관련 문제