2009-07-02 5 views
2

I의 Visual Studio SP1을 사용하여 프로젝트의 EXE는 이제 내장되어 9Howto : msvcrt9의 여러 버전이 개인 SxS 어셈블리로 사용됩니까?

비주얼 스튜디오를 사용하여, 사전 빌드의 DLL 모듈을 포함하는 프로젝트를 과거에 약간의 시간을 구축 9.

EXE를 배포 할 때 관리 액세스가 필요하지 않으므로 C 런타임이 응용 프로그램의 루트에 번들되었습니다. Dlls : MSVCRT90.DLL 및 해당 Manifest : Microsoft.VC90.CRT.manifest

이제 런타임 매니페스트의 EXE 및 최신 버전이 모두 일치합니다. 응용 프로그램 매니페스트는 msvcrt.dll의 9.0.30729.1을 묻습니다. crt-manifest에는 msvcrt90.dll이 버전 9.0.30729.1임을 확인하는 항목이 포함되어 있습니다.

이제 문제가 생겼습니다. 응용 프로그램에서 사용하는 타사 DLL 라이브러리는 원본 msvcrt90.dll 버전 9.0.21022.8과 연결되어 있으며이 효과에 대한 내부 매니페스트가 있습니다.

두 버전의 VS9 CRuntime이 설치된 개발 PC에서는 응용 프로그램이 작동합니다. 처음으로 앱을 설치하는 "신선한"PC에서 - DLL이로드되지 않습니다.

이제 할 수있는 한 가지 방법이 있습니다. 하나는 9.0.2로 되돌리기로, 원본 소스 미디어에서 9.0.2 DLL을 가져 오는 것입니다. 9.0.3이 바람직하기 때문에 바람직하지 않습니다. 또는 제 3 자 라이브러리를 다시 작성하기 위해 열심히 노력합니다.

우리의 개발 PC에서 제 3 자 라이브러리가 새 dll로 리다이렉트되는 오래된 dll을 요청할 때, 바이너리 호환이 가능하다는 것을 확신합니다.

응용 프로그램 목록 및 어셈블리는이 종류의 쓰레기에서 우리 모두를 구하기위한 것입니다. exe와 dll이 모두로드 될 수 있도록 어셈블리 매니페스트 파일을 편집 할 수 있어야합니다.

답변

2

나는 그것을 결코 시도하지 못했지만 manifest에서 bindingRedirect를 사용하여 해결할 수 있다고 생각합니다. 관리되는 세계에서 작동한다는 것을 알고 있습니다.

예를 참조 이것은 필자는 노력 것과 매우 가까운

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<configuration> 
    <windows> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <assemblyIdentity name="Your.Application.Name" type="win32" version="9.0.0.0"/> 
     <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
     <bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
     <bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.MFCLOC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"> 
     </assemblyIdentity> 
     <bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </windows> 
</configuration> 
+0

(당신은 당신의 버전 값을 변경해야합니다). 어디에서 어떻게 XML을 배치 할 수 있습니까? 내 응용 프로그램에 .manifest 파일이 포함되어 있으며 설명서에 bindingRedirections가 app.exe.config 파일에 있어야한다고 나와 있습니다. 내가 설정 파일을 만들었어요, 내 애플 리케이션 폴더에 배치하고 어떤 차이가 보이지 않습니다. 그것의 사용 된조차 확실하지 않다. 아마도 assemblyIdentity가 내 앱 매니페스트 어셈블리와 완벽하게 일치해야합니다. –

+0

매니페스트 내부에 있어야합니다. VS에서 생성 한 매니페스트에 고유 한 선언을 추가 할 수 있습니다. 여기서는 VS이 없으므로 정확한 방법을 제공 할 수 없지만 어딘가에 프로젝트 설정 \ manfirst 도구 아래에 있습니다. –

+2

몇 가지 설명 : EXE에 리디렉션해야하는 종속 어셈블리가있는 경우 로컬 정책 파일의 적절한 이름은 다음과 같습니다. application.exe.config - 리디렉션이 필요한 종속 어셈블리가있는 위성 DLL 인 경우 정책 파일은 dllname.dll.2.config라고 불립니다 - 왜 .2? 나는 모른다. 하지만 거기에 있어야합니다. –

관련 문제