2009-10-06 3 views
2

우리의 응용 프로그램은 각각 자신의 하위 디렉토리에있는 사설 어셈블리 집합을 동적으로로드합니다. 그들 각각은 동일한 서브 디렉토리에있는 그들 자신의 의존성을 가지고있다. 각 어셈블리의 이름은 강력하고 종속성은 동일한 라이브러리이지만 버전은 다릅니다.왜 개인 어셈블리 검색에서 정규화 된 어셈블리 이름을 사용하지 않고 파일 이름과 일치합니까?

MyApp 
|-> Folder1\ 
|   |->PrivateAssembly1.dll 
|   |->Dependency.dll     Version 1.0.0.0 
| 
|-> Folder2\ 
|   |->PrivateAssembly2.dll 
|   |->Dependency.dll     Version 2.0.0.0 
| 
... 

우리는 GAC를 사용하지 않도록 xcopy 배포를하고 있습니다.

또한 probing privatePath"Folder1;Folder2"으로 정의하여 개인 어셈블리를 찾지 못하는 문제를 해결했습니다.

문제는 PrivateAssembly1.dll은 해당 종속성을 찾지 만 PrivateAssembly2.dll은 찾지 못하는 것입니다. 또는 오히려, Folder2 대신에 Folder1에서 Dependency.dll을 사용하려고 시도하는 것 같습니다.

나는이 문제가 AssemblyResolve 이벤트를 사용하여 수동으로 해결할 수 있다는 것을 알고 있지만 가장 명확한 방법은 아닙니다. 내가 바라 보는 다른 해결책이 있습니까?

모든 아이디어에 감사드립니다.

업데이트 :

퓨전 로그 도구의 출력 :

LOG: DisplayName = Dependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=######### 
(Fully-specified) 
LOG: Appbase = file:///C:/Workspaces/Shell/MyApp/bin/ 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = NULL 
LOG: AppName = NULL 
... 
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Dependency.DLL. 
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Dependency/Dependency.DLL. 
LOG: Attempting download of new URL file:///C:/Workspaces/Shell/MyApp/bin/Folder2/Dependency.DLL. 
LOG: Assembly download was successful. Attempting setup of file: C:\Workspaces\Shell\MyApp\bin\Folder2\Dependency.dll 
LOG: Entering run-from-source setup phase. 
LOG: Assembly Name is: Dependency, Version=2.0.0.0, Culture=neutral, PublicKeyToken=####### 
WRN: Comparing the assembly name resulted in the mismatch: Major Version 
ERR: The assembly reference did not match the assembly definition found. 
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated. 

그래서 기본적으로는, Folder2 폴더에 Dependency.dll 발견은 버전이하지 않는 것을보고 그것을로드하려고 시도 시합. 나는 다음에 Folder1을 시도 할 것이라고 가정하지만, 그저 멈출 것입니다.

답변

1

가장 먼저 할 일은 어셈블리 로딩의 로깅을 활성화하기 위해 퓨전 로그 뷰어 "FUSLOGVW.exe"을 사용하는 것입니다. 그러면 CLR이 종속성을로드하려고하는 위치가 표시됩니다. 이 경우 일부 위치에 —이 누락되어 있는지 확인하고 .config에서 누락 된 부분을 알려야합니다.

[편집 : 이제 로그로]

일치하는 어셈블리 이름 일단은 더 이상 (파일) 검색이 발생, 발견되었다. 나는. 어셈블리 이름을 고유하게 유지하십시오.

은 (이것은 C++ 방식의 오버로드 확인과 유사 먼저 최고의 경기를 발견하고 접근이 고려되지 않습니다 액세스 할 수 있으므로 약한 매개 변수 일치를 확인합니다.)

1 NB. 64 비트 시스템에서 실행중인 경우,이 도구는 별도의 32 비트 및 64 비트 버전입니다. 올바른 버전을 사용하십시오.

+0

감사합니다. 질문에 로그를 추가했습니다. –

0

.NET 개체가이 이유는 같은 어셈블리의 다른 버전을 appdomain에로드하려고하는 이유입니다. PrivateAssembly1.dll과 PrivateAssembly2.dll이 실제로 동일한 라이브러리 버전을 사용할 수 있는지 결정해야합니다. 이것이 가능하면 많은 문제를 줄일 수 있습니다.

Dependency.dll을로드하는 사용자 지정 해결 프로그램을 추가하여 Dependency.dll의 두 버전을 모두 appdomain에로드하도록 강제 할 수는 있지만이 경우 비교적 좁은 경로를 입력한다는 점에 유의해야합니다. 예를 들어 두 버전 모두 정적 변수의 버전이 다르며 Folder1 \ Dependency.dll 어셈블리에서 만든 형식은 Folder2 \ Dependency에서 인식되지 않습니다.dll 어셈블리, 그리고 그 반대의 경우에도 형식이 "같을 수 있습니다."

+0

그러나 우리는 PrivateAssemblies가 Dependency.dll의 특정 버전을 사용하는 유일한 방법이라는 것을 알고 있습니다. Dependency.dll은 실제로 두 응용 프로그램이 모두 빌드 된 프레임 워크 라이브러리입니다 (PrivateAssembly1, PrivateAssembly2). 이 프레임 워크 라이브러리와 응용 프로그램은 독립적으로 개발 될 것이므로 응용 프로그램이 서로 다른 버전의 lib에서 작동 할 가능성이 높습니다. –

관련 문제