응용 프로그램 당 구성 파일 바인딩 레디렉션은 DLL에 적용되지 않습니다

StackOverflow https://stackoverflow.com/questions/1347713

  •  20-09-2019
  •  | 
  •  

문제

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 파일에 액세스하지 못합니다.

로그 오프/켜기로 인해 구성 파일을 다시 읽을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top