응용 프로그램 당 구성 파일 바인딩 레디렉션은 DLL에 적용되지 않습니다
문제
ver 6 commctl32.dll에 명백한 의존성을 포함하여 XP에서 uxtheme을 시연하기 위해 간단한 Win32 응용 프로그램을 만들었습니다. 그런 다음 간단한 Win32 DLL을 만들었습니다. ISOLATION_AWARE_ENABLED
, comctl32.dll의 버전 5와 6을 지정하는 임베디드 매니페스트로 테스트했습니다.
이 메소드를 사용하여 다른 버전의 comctl32.dll을 사용하도록 EXE와 DLL을 성공적으로 얻었습니다. EXE가 5와 DLL 버전 6을 사용하고 다른 방법으로.
그런 다음 앱과 DLL을 재설정하여 comctl ver 5 manifest 종속성을 갖습니다. 응용 프로그램 구성 파일을 소개했습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df"/>
<bindingRedirect oldVersion="5.82.7100.0" newVersion="6.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</windows>
</configuration>
이제 응용 프로그램을 실행하면 응용 프로그램이 Commctl V6으로 분명히 방향을 바꾸고 있습니다. XP UXTheme을 사용하여 대화 상자가 명확하게 표시됩니다. 그러나 DLL은 리디렉션되지 않으며 Commctl의 비 테마 VER 5를 사용하고 있습니다.
문서에서 BindingRedirects를 수행하기위한 Per-DLL 구성 파일에 대한 언급은 없습니다. 그리고 하나를 만들려고하는 것은 아무것도하지 않습니다.
또한 한 주요 버전의 어셈블리에서 다른 주요 버전에서 다른 버전에서 바인딩 레디렉션을 수행하는 것은 지원되는 시나리오가 아니라 실제로 CommcTL32를 역학을 테스트하는 명백한 쉬운 방법으로 사용합니다.
DLL의 종속 어셈블리 버전을 어떻게 리디렉션합니까?
해결책 2
그래서이 질문에 대한 답변이 있습니다.
- 프로세스 모니터를 사용하여 파일 액세스를 추적했습니다.
- .manifest 및 .config 파일에 대한 액세스가 내 자신의 프로세스가 아닌 CSRSS.Exe에서 나온다는 것을 인식 한 후
- Windows Vista는 EXE의 날짜 시간 스탬프와 함께 존재를 캐시 할 때 나중에 추가되는 .manifest 또는 .config 파일에 액세스하지 못합니다.
결국 DLLS를로드 할 때 loadLibrary가 .config 파일을 조사한다는 것을 발견했습니다.
full_path_to_dll\dllname.dll.2.config
이 파일의 바인딩 리디렉션이 처리됩니다.
다른 팁
Windows Vista는 EXE의 날짜 시간 스탬프와 함께 존재를 캐시 할 때 나중에 추가되는 .manifest 또는 .config 파일에 액세스하지 못합니다.
로그 오프/켜기로 인해 구성 파일을 다시 읽을 수 있습니다.