2012-02-22 3 views
1

Visual C++ 런타임을 private assemblies (즉, msvcp90.dll, msvcm90.dll, msvcr90.dll 및 Microsoft.VC90.CRT.manifest를 응용 프로그램의 실행 파일과 같은 디렉터리에있는 Microsoft.VC90.CRT 폴더). 지금까지는 모든 비 -dex 머신 (수백 개)에서 이것은 괜찮 았습니다. 그러나, 나는이 어셈블리를 찾을 수없는 특정 문제 기계를 추적하고 있습니다. 그들은 우리의 응용 프로그램을 실행하려고 할 때 그들은 XP를 실행하는대상 컴퓨터에 확실히있는 개인 어셈블리를 찾을 수 없습니다.

, 그래서, 그들은 message을 얻을 :

는이 응용 프로그램은 응용 프로그램 구성이 올바르지 않기 때문에 시작하지 못했습니다. 응용 프로그램을 다시 설치하면이 문제가 해결 될 수 있습니다.

우리 응용 프로그램의 exe에서 Dependency Walker을 실행 시켰고 msvcp90.dll 또는 msvcr90.dll을 찾을 수 없다고 표시했습니다. 나는 그 다음 그들이 우리의 app의 디렉토리 내용을 추적하도록 시켰는데, 그 "누락 된"DLL은 사실 그들이 있어야 할 곳 (exe에 인접한 Microsoft.VC90.CRT 디렉토리 안에 있음)이지만, 시작했을 때 그들을 찾지 못했습니다.

최후의 수단으로 나는 그들 install the redistributables을 직접 가지고 있습니다. 그러나 이것은 문제 해결을위한 것일뿐입니다. 우리는 추가 설치 프로그램없이 DLL을 계속 배포하기를 원합니다. (우리의 앱은 설치없이 간단히 실행할 수 있습니다.)).


나는 아마도 우리의 응용 프로그램의 자신의 매니페스트를 포함해야한다 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="OurApp.Name" type="win32"/> 
    <description>Our App Description</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"> 
     </assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

편집 : 나는 이전에 dependentAssembly이 아니라고 언급,하지만 난 발생되는 것을 깨달았다, 그래서 위의 매니페스트 실제로 생성 된 매니페스트를 반영합니다.


프로그램에서 이러한 종속성을 찾지 못하게 할 수있는 원인은 무엇입니까? 많은 다른 컴퓨터에서 정상적으로 작동합니다. 대부분이 이전에이 런타임을 본 적이 없었습니다. 난 아마 뭔가를 (아마도 내 명단에 가능성이) 엉망이지만, 클라이언트 컴퓨터의 99 %까지 지금까지 잘 실행됩니다.

보너스로 this article은 비공개 어셈블리에 대한 좋은 요약이지만 지금까지는 나를 해결하지 못했습니다.

업데이트 : DLL을 EXE와 같은 디렉터리로 이동 한 후에도 계속 실행되지 않았습니다. 그런 다음 installing the redistributables 이후에 시작되었습니다. 따라서 로컬 디렉토리를 찾지 못하거나 로컬 DLL을 사용할 수없는 것으로 여겨지는 것처럼 보입니다.

답변

1

같은 Windows 컴퓨터에 현재 설치된 Visual Studio 버전이 있습니까?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx도 자세히 볼 수 있습니다. 이 링크에는 운영 체제에서 DLL을 검색하는 방법에 대한 정보가 들어 있습니다. 해당 동작을 변경할 수있는 몇 가지 레지스트리 키가 있습니다.

이 종속성을 제거하는 다른 옵션은 프로젝트에서 MFC/ATL과 정적 링크를 사용하는 것입니다. 바이너리는 더 커질 것이지만,이 문제는 모두 함께 제거됩니다.

0

필자는이 문제를 빨리 해결하기 위해 노력했지만, 테스트 케이스를 기다리는 것은 매우 번거롭기 만했습니다. 놀랍게도 간단한 문제였습니다. 잘못된 DLL 버전을 찾고있었습니다. VS에 의해 생성 된 매니페스트는 VS에서 추출한 재배포 가능 파일과 동일한 버전을 사용하도록 설정되지 않았습니다. 매니페스트의 자동 생성을 비활성화하고 내 매니페스트에서 버전을 설정하여 재배포중인 DLL의 버전과 일치시킴으로써 작동합니다.

관련 문제