2012-04-05 4 views
2

이것은 어제 요청한 a question과 연결되어 있습니다. 간단히 말해, 내가 가지고있는 문제는 어셈블리의 두 충돌 버전이 있다는 것입니다. 하나는 appbase에 있고 다른 하나는 PrivateBinPath에 있습니다.어셈블리 리졸버 검색 순서 변경

어셈블리 리졸버가 먼저 appbase를 검색 한 다음 개인 경로에서 검색하는 것으로 알고 있습니다. 문제는 퓨전 로그를 실행하여 얻은 결과를 바탕으로 해결사가 appbase에서 잘못된 버전을 찾으면 버전이 일치하지 않으며 검색을 중지한다는 오류가 발생합니다.

appbase에있는 참조를 사용해야하므로 PrivateBinPathProbe를 설정하는 것은 appbase를 제외하기 때문에 옵션이 아닙니다. 먼저 PrivateBinPath에서 검색 순서를 변경하는 방법이 있습니까?

잘못된 버전을 발견하면 리졸버가 그냥 포기하는 이유를 이해할 수 없습니다.

+0

은 강력한 이름의 어셈블리입니까? 우리는 다른 어셈블리 버전 또는 동일한 어셈블리 버전과 다른 파일 버전을 가진 두 파일에 대해 이야기하고 있습니까? –

+0

@mike z : 강력한 어셈블리, 다른 버전. – user472875

답변

1

는 AFAIK 그렇게 할 수있는 옵션이 없습니다 ... 당신은 그러나 해결 방법을 구현할 수

:

  • 가 설치 AssemblyResolve handler
  • 무엇이든 원하는 위해 당신이 원하는 목적지까지 검색 할 처리기를 구현을 필요가 있습니다

또 다른 옵션은 EXE/DLL에 종속성을 포함시켜 모든 경로를 검색 할 필요가 없습니다. 이를 달성하기위한 옵션은 here을 참조하십시오.

+0

어쩌면 내가 잘못 했어.하지만 핸들러가 잡은 모든 AssemblyResolve 이벤트를 추적하려고했는데, 내 것이 결코 나오지 않았습니다. – user472875

+0

@ user472875 자세한 내용/소스 코드 등이 없으면 진단하기가 어렵습니다. 하나의 가능한 설명은 어셈블리의 두 가지 버전을 같은 프로세스에로드하면 이상한 결과가 발생할 수 있다는 것입니다. – Yahia

+0

약간 다른 상황이지만 그대로 있습니다. PrivateBinPath에 압축을 푼 리소스는 실제로 코어 DLL에 임베드됩니다. 내가 가진 한 가지 옵션은 파일 경로에 Assembly.LoadFrom을 사용하여 어셈블리를 수동으로로드하는 것입니다. 그것은 정말로 피하고 싶습니다 해킹입니다. – user472875

2

AssemblyResolve 이벤트는 이전 조회가 성공하지 못한 경우에만 호출됩니다. 그래서 당신은 당신의 이전 질문에서 답을 야히아에서 접근 방식을 결합해야 :

  1. 퓨전은 AppBase 디렉토리에 보이지 않는 것 너무 PrivateBinPathProbe을 설정합니다.
  2. AppBase 디렉터리의 경로를 확인하는 AssemblyResolve 이벤트를 구현합니다.
  3. ...
  4. 이익!

첫 번째 단계는 이벤트가 시작되도록하는 것이 중요합니다.