프로그래밍 노트

C/C++ 분산 어플리케이션 및 side-by-side 어셈블리 트러블 슈팅 본문

MFC TIP

C/C++ 분산 어플리케이션 및 side-by-side 어셈블리 트러블 슈팅

띠리 2007. 7. 3. 13:57
C/C++ 분산 어플리케이션 및 side-by-side 어셈블리 트러블 슈팅
(Troubleshooting C/C++ Isolated Applications and Side-by-side Assemblies)

의존하는 Visual C++ 라이브러리가 발견되지않는 겨우는 C/C++ 어플리케이션의 읽어들이기에 실해하는 경우가 있다. 발생하는 가능성이 있는 런타임 에러의 일람에 관해서는 "Visual C++파일의 재배포"를 참조하면 된다.
이 섹션에서는 C/C++ 어플리케이션의 읽어들이기에 실패하는 가장 일반적인 이유에 대해서 문제해결의 방법을 알아본다.

Visual C++가 인스톨되어 있지 않은 컴퓨터에 어플리케이션을 카피하고 "Visual c++파일 재배포"에 열거되어진 에러 메세지로 어플리케이션이 크래쉬한 경우, 몇개의 포인트를 확인하여 에러의 원인을 찾아내야 된다.

1. "Visual c++ 어플리케이션의 의존관계의 이해"의 순서에 따른다. Dependency Walker에는 특정의 어플로케이션 또는 DLL의 대부분의 의존관계를 표시할 수 있다. 표시되어져 있지않은 DLL이 있는 경우는 어플리케이션을 실행하는 컴퓨터에 그 DLL을 인스톨한다.

2. 오퍼레이팅 시스템 로더는 메니페스트를 사용하여 어플리케이션이 의존하는 어셈블리를 읽어들인다. 메니페스트는 리소스로서 바이너리에 넣는 것도 외부 파일로서 어플리케이션의 모컬 폴더에 보전하는 것도 가능하다.
메니페스트가 바이너리 안에 들어가 있는지를 확인하기 위해서는 Visual Studio에서 바이너리를 열어 이 바이너리 리소스를 조사하면된다. 들어가 있는 경우에는 RT_MANIFEST라고 하는 리소스를 볼수있다. 바이너리에 넣어진 메니페스트가 없을때는 <binary_name>.<extension>.manifest와 같은 이름의 외부 파일을 찾는다.

3. 메니패스트가 없는 경우는 링커에 프로젝트의 메니페스트를 만들어야된다. 이 프로젝트의 "프로젝트 속성" 다이얼로그의 링커의 메니페스트의 생성 옵션을 예로 한다.

메모
메니패스트가 생성하지 않는 Visual C++ 프로젝트의 빌터는 서포트하지 않는다.
Visual C++ 2005에서 빌드되어지는 C/C++프로그램은 모두 Visual C++ 라이브러리에의 의존 관계를 기술한 메니패스트를 포함해야된다.

4. 메니페스트가 라이브러리안에 들어있는 경우는 RT_MANIFEST의  ID가 그 타입의 바이너리에 적절한 ID인지를 확인한다. 어플리케이션의 경우는 ID를 1로, 또는 거의 DLL의 경우는 ID를 2로  해야된다. 메니페스트가 외부 파일의 경우는 XML에디터나 텍스트 에디터를 열어서 메니페스트 및 배치의 룰의 상에 대해서는 "Manifests"를 참조한다.

메모
Windows XP에서는 외부 메니페스트가 어플리케이션의 로컬 폴더에 있는 경우, 오퍼레이팅 시스템 로더는 바이너리에 넣어진 메니페스트를 이용하지않고 이 외부 메니페스트를 사용한다.
Windows Server 2003 및 이 이후의 버젼의 Windows에서는 이 우선 순위가 바뀌어 바이너리에 넣어진 메니페스트가 있는 경우 그것을 이용하고 외부 메니페스트는 무시한다.

5 모든 DLL이 바이너리로 넣어진 메니페스트를 갖는 것을 권장한다.
DLL이 LoadLibrary 호출로 읽어지는 경우 외부 메니페스트는 무시되어진다.
자세한 내용은 "Assembly manifests"를 참조 바람.

6. 메니페스트에 열거되어진 모든 어셈블리가 컴퓨터에 바르게 인스톨되어져 있는지를 확인한다.
각 어셈블리는 이름, 버젼번호, 및 프로세스 아키텍쳐로 메니페스트에 지정한다. 어플리케이션은 side-by-side 어셈블리에 의존하고 있는 경우 이것들은 어셈블리가 컴퓨터에 적절하게 인스톨되어 오퍼레이팅 시스템 로더로 검출할 수 있는 것을 "Assembly Searching Sequnce"로 지정되어있는 순서를 사용해서 확인한다. 64비트 어셈블리는 32비트 프로세스로 읽어들이거나 32비트 오퍼레이팅 시스템으로 실행할 수 없는 것에 주의한다.

--------------------------------------------------

http://msdn2.microsoft.com/ja-jp/library/ms235342(VS.80).aspx

이 글은 위 글을 번역한 것
이해가 잘 안온다. -.-;;
메니페스트 개념도 잘 모르겠고
밥통같은 Visual C++ 2005는 DLL을 따로 카피해야되는건가?
Comments