문제

때문에 우리의 전환에서는 Visual Studio6Visual Studio2008 년,우리는 우리가 사용하는 MFC90.dll 고 msvc[pr]90.dlls 와 함께는 매니페스트에서 파일을 전용 side-by-side 구성하도록에 대해 걱정하지 않 버전 또는 그들을 설치하는 시스템입니다.

Pre-SP1,이동(그리고 아직도 잘 작동에 우리의 개발자 컴퓨터).지금 우리가 하는 일부를 테스트 SP1 이후 나는 당신 때문에 어제됩니다.

먼저,우리의 NSIS 설치 스크립트를 끌어 dll 및 매니페스트에서 파일을 재배포 폴더에 있습니다.이들은 더 이상 올바른 응용 프로그램은 여전히 연결 RTM 버전입니다.

그래서 나는 추가에 대해 정의 _BIND_TO_CURRENT_VCLIBS_VERSION=1 우리의 모든 프로젝트도록 사용하여 SP1Dll 에서 재배포 폴더(또는 후속 사람으로 새로운 서비스 팩 나올).그것은 내게 찾을 시간이다.

이런 생성 된 매니페스트 파일로서 중간 파일 폴더에서 컴파일하고 그들이 제대로 목록으로 9.0.30729.1SP1 버전입니다.나중과 트리플 확인에 따라 청소하기:그것은 모든 링크를 지 dll no 오류가 있습니다.

응용 프로그램을 실행하고 여전히 다음과 같은 오류가:

실패 응용 프로그램을 제대로 초기화(0xc0150002).확인을 클릭하면 응용 프로그램을 종료.

없음 검색을 할 수글 또는 마이크로 소프트가 오는 것과 관련해 특정 문제점(하지만 거기에 다시 안타 2005 년 이 오류 메시지가).

어떤 하나의 유사한 문제가 있었다 SP1?

옵션:

  • 문제를 찾아서 그것을 해결 그래서 그것으로 작동해야(preferred)
  • 설치하는 재배포
  • 파 old RTM dll 및 매니페스트 파일을 제거하고#define 사용하는 방법입니다.(나는 그들이 이전에 설치 관리자를 구축,이후 Microsoft 폭발 그들의 재배포 폴더!)

편집: 나가려고 다시 구축으로 정의하는 꺼(에 대한 링크를 RTM dll),작동하는 만큼 RTM dll 에 설치된 폴더에 있습니다.는 경우 SP1dll 에 떨어진,그것은 다음과 같은 오류가:

c:\Program Files\...\...\X.exe

이 응용 프로그램을 시작하지 못했기 때문에 응용 프로그램 구성이 잘못되었습니다.응용 프로그램을 다시 설치하면 이 문제를 해결할 수 있습니다.

에는 아무도 다른 사람을 처리했고 이 문제입니까?

편집: 그냥 웃는다,나는 다운로드 및 실행 vcredist_x86.exe 에 대한 VS2008SP1 에 나 테스트 시스템이다. 작동합니다.와 SP1DLLs.내 RTM 연결된 앱입니다.지 개인 side-by-side 배포하는 일 pre-SP1.

도움이 되었습니까?

해결책

난 이 문제는 자신의 마지막 일주일을 고려 자신이 어느 정도의 전문가 금)

나 99%는지 확인하지 않는 모든 dll 및 정적 라이브러리를 다시 컴파일되었다와 SP1 버전입니다.당신이 필요하 넣

#define _BIND_TO_CURRENT_MFC_VERSION 1
#define _BIND_TO_CURRENT_CRT_VERSION 1

프로젝트를 사용합니다.모든 프로젝트의 실제 크기,그것은 매우 쉽게 잊는 몇 가지 작은 lib 지 않은 다시 컴파일.

더 많은 플래그를 정의하는 어떤 버전에 바인딩하여;그것은 문서화 http://msdn.microsoft.com/en-us/library/cc664727%28v=vs.90%29.aspx .에 대한 대안으로 선택할 수 있습도

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

는 것입니다 바인딩하여 최신 버전의 모든 VC libs(CRT,MFC,ATL,OpenMP).

그런 다음,어떠한지 확인 임베디드 명시 말한다.다운로드 XM 리소스 편집기: http://www.wilsonc.demon.co.uk/d10resourceeditor.htm.매 dll 및 exe 에서 당신의 솔루션입니다.아래에 보면'XP 테마 Manifest'.는지 확인'버전은'특성에 오른쪽은'9.0.30729.1'.면 그것은'9.0.21022',일부는 정적 라이브러리를 당기는 매니페스트에서 오래된 버전입니다.

내가 무엇을 발견한 경우에는, 모두 버전에 포함되었습니다즉,일부 라이브러리를 사용하여 sp1 버전과 다른 하지 않습니다.

훌륭한 방법으로 디버깅하는 라이브러리가 없는 전처리기는 지시어 설정:일시적으로 수정 플랫폼 헤더도록 컴파일을 정지하려고 하면 포함하는 오래된 나타납니다.오픈 C:\Program Files\Microsoft Visual Studio9.0\VC\crt\include\crtassem.h.검색에 대한'21022'문자열입니다.에서 정의하는 넣고,무언가 잘못되었(변경'정의'로'blehbleh'도).이 방법은,당신이 컴파일하는 프로젝트 _BIND_TO_CURRENT_CRT_VERSION 전처리기는 깃발을 설정하지 않은 컴파일을 중지하고 당신은 필요가 있다는 것을 알고 그들을 추가하거나 만들었는지 확인에 적용된다.

또한 확인을 사용하여 종속성 워커는 것을 알 수 있도록 dll 을 가져온되고 있습니다.그것은 쉬운 설치 신선한 윈도우 XP 에서 사본으로 업데이트만(SP2)에서 가상 기계입니다.이 방법은 확실히 알고 있는 것에서 아무것도 SxS 폴더에 사용되는 대신 side-by-side dll 을 제공합니다.

다른 팁

을 이해하는 문제,나는 그것을 깨닫는 것이 중요하다는 거기에 네 버전 숫자 참여:

  • (A)버전의 VC 헤더 파일을.exe 컴파일합니다.
  • (B)버전은 매니페스트 파일에 포함된 자원 절입니다.exe.기본적으로,이니페스트 파일이 자동으로 생성되 Visual Studio.
  • (C)버전의 VC.DLLs(의 일부 side-by-side 어셈블리)복사에서와 같은 디렉토리.exe.
  • (D)의 버전 VC 매니페스트 파일(부분의 side-by-side 어셈블리)복사에서와 같은 디렉토리.exe.

의 두 가지 버전이 있습니다 VC2008DLL running:

  • v1:9.0.21022.8
  • v2:9.0.30729.4148

명확성을 위해 사용한다고 가정하고 설명하겠 v1/v2 표기 합니다.다음 표의 번호를 가능한 상황:

Situation | .exe (A) | embedded manifest (B) | VC DLLs (C) | VC manifests (D)
-----------------------------------------------------------------------------
1         | v2       | v1                    | v1          | v1         
2         | v2       | v1                    | v2          | v2          
3         | v2       | v1                    | v2          | v1
4         | v2       | v2                    | v2          | v2

의 결과는 이러한 상황을 실행하는 경우.exe 에 Vista SP1 설치:

  • 1 상황:팝업 표시,말하기:"절차를 입력 포인트 XYZXYZ 수 있는 동적 링크 라이브러리에서".

  • 상황 2:아무것도 일어날 것으로 보인다 실행하는 경우.exe 지만,다음과 같은 이벤트 로그는 Windows'"이벤트 뷰어/응용 프로그램 로그":

    활성화 컨텍스트를 생성하지 못했"C:\Path\file.exe".오류에 명시 또는 정책 파일을"C:\Path\Microsoft.VC90.CRT.MANIFEST"온라인 4.구성 요소를 정체성을 발견에 명시와 일치하지 않 정체성의 구성 요소에 요청합니다.Reference Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8".정의는 Microsoft

  • 상황 3:모든 것을 잘 작동합니다.이 remicles2 솔루션.

  • 상황 4:이 어떻게 해야 할.유감스럽게도,Roel 나타냅니다,그것은 오히려 어려울 수 있습니다.

지금,나는 상황(그리고 나는 생각은 그것과 동일 crashmstr 의 는)nr1.문제는 Visual Studio 이유 중 하나 또는 다른 클라이언트 코드를 생성(A)v2 지만,하나 또는 다른 이유에 대해 생성됩니 v1 매니페스트 파일(B).나는 아무 생각이 없는 버전(A)구성할 수 있습니다.

참고 는 이 전체적인 설명은 아직도에서의 컨텍스트 전용 어셈블리.

업데이트:마지막으로 나가는 것을 이해하기 시작하는 것입니다.분명히, Visual Studio 에서 생성하는 클라이언트 코드는(A)를 기본적으로 v2, 반면에 어떤 Microsoft 블로그입니다.은 다음 코드 줄을 사 깃발을 선택 버전에서 생성되는 매니페스트 파일(B)지만,이 버전은 무시할 때 응용 프로그램을 실행.

결론

니다.exe 컴파일되는 Visual Studio2008 에 대한 링크를 최신 버전의 VC90Dll 을 기본적으로 합니다.수 를 사용하여 다음 코드 줄을 사 flag 을 제어하는 버전의 VC90 라이브러리에서 생성될 것이 매니페스트 파일입니다.이 사실을 방지 상황 2 는 오류 메시지"manifest 과 일치하지 않는 정체성의 구성 요소를 요청".그것은 또한 이유를 설명하는 상황 3 잘 작동하도 없이 다음 코드 줄을 사 깃발 응용 프로그램은 연결되어의 최신 버전 VC DLLs.

상황은 심지어 이상으로 대중 side-by-side 어셈블리,어디 vcredist 실행하고,VC9.0Dll Windows SxS 디렉토리에 있습니다.는 경우에도.exe 매니페스트 파일에서는 오래된 버전의 Dll 을 사용해야 한다(이것은 경우 다음 코드 줄을 사 깃발을 설정되지 않음),Windows 를 무시 이 버전 번호를 기본적으로!대신에,윈도우를 사용하는 최신 버전에 존재하는 경우에 시스템을 제외하고, 때"응용 프로그램의"구성 파일 사용됩니다.

나만 생각하는 사람이 혼란?

그래서 요약:

  • 전용 어셈블리를 사용하여 다음 코드 줄을 사 플래그.exe 의 프로젝트 모든 에 의존합니다.lib 프로젝트입니다.
  • 공 어셈블리,이 필요하지 않습으로 윈도우 자동으로 선택하고 올바른 버전의.Dll 을 SxS 디렉토리에 있습니다.

나는 그냥 기도가 나를 찾는 데 사용하는 정적 라이브러리가 나쁘게 행동:'grep'를 통해 정적 라이브러리에 대한 문자열'21022'.그러나 사용하지 않는'정상'grep 도구 wingrep 기 때문에 표시되지 않는 당신이 이 문자열은(그들은 그것을 생각하는 바이너리 파일을 찾기 위해 원,non-유니코드 문자열).를 사용하여 문자열에서 유틸리티 리소스 키트(에서 지금이 분명히 제가 생각하는 사이트).는 것입니다 grep 을 통해 바이너리 확인.그래서 당신이 이 문자열에 가을 통해 귀하의 전체 소스 트리를 볼 것 바이너리 파일(dll 및 정적 라이브러리)을 참조를 포함하여 잘못 매니페스트(또는 매니페스트와 함께 잘못된 버전에서 그것).

다른 좋은 도구를 보기 위해 자신의 dll 매니페스트 매니페스트 보기, 는 한마디로 충분에서 실행되지 않습니다 깨끗하고 설치하의 XP,기 에 따라 달라집 9.0.21022.

에 대한 세 번째 옵션을 찾을 수 있습니다 아마 Dll 을 명시한 9.0.21022 버전에서 C:\WINDOWS\WinSxS 디렉토리에 dev 기계입니다.할 수 있는 경우,다음 설정할 수 있습니다 당신의 자신의 재배포 디렉토리를 설치 파일와 함께합니다.

또는,사용할 수 있습니다 9.0.30729.1 로 사용된 것은 Visual Studio 위조은 매니페스트를 설치하는 앱과 함께하는 보고서를 제공 9.0.21022Dll,지 9.0.30729.1.런타임을 링커에 보이지 않는 마음입니다.이 블로그, 되고 있는 대단히 유용한 이러한 문제를 해결을 위해,더 많은 정보입니다.

모두 해결 방법이 고정된 문제가 있었과 Dll 을 배포하는 개인으로 어셈블리 VS2008 표현합니다.

Roel 의 대답은 간단한 방법으로 당신의 첫 번째 옵션("수정"오른쪽)지만,경우에 따라 달라지는 라이브러리에 따라 달라집 9.0.21022(및 매니페스트에 따라서는 목록 모두 버전),그리고 세 번째 옵션을 할 수있는 유일한 방법이 될 수 있습을 가지 않으려면 실행 vcredist_x86.exe.

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