Skip to content

VisualStudio:Manifest

About

사실 Visual Studio 2005 (VS2005)를 사용해 오면서 신경쓰지 않았던 부분이 바로 이 manifest file의 존재다. 아마 이글을 본사람들 중에 상당수도 '저게 뭐임?' 이라고 생각하는 사람이 많을 것이라 생각된다. 이 manifest의 중요성은 내가 만든 프로그램을 다른 컴퓨터에서 돌려볼려고 할때 나타난다.

일단 .NET Framework를 알아야 한다. 다 알거는 없고, 이 녀석은 간단히 말해서 컴퓨터의 spec에 관계 없이 VS2005로 작성한 프로그램이 잘 돌아가도록 해주는 놈이라고 생각하자. 그니까 int가 4바이트인 컴퓨터건 8바이트인 컴퓨터건 (32 비트 컴퓨터냐 64 비트 컴퓨터냐) 관계없이 내가 짠 프로그램이 잘 돌아가도록 해준다. 상식적으로 .NET Framework가 컴퓨터에 관계없이 내 프로그램을 잘 돌아가게 만들어 준다는 것은 .NET Framework가 어떤 공통적인 무언가를 가지고 있거나 아니면 통일된 규정에 따라서 해당 컴퓨터에 맞게 Binary code (실행 코드)를 만들어 낸다는 것이다.

.NET Framework Assemblies를 보자. 이 것은 일부만 컴파일된 dll 파일들이다. 이 것은 프로그램이 실행되는 시점 (CLR이 Just-in-time complier를 이용해 machine code를 생성해 내는 시점)에 호출되어 사용된다. 한마디로 필요한 정보가 저장된 도서관(library)이다. 중요한 것은 이제부터인데, VS2005를 이용해서 프로그램을 작성하게 되면 기본적으로 VS2005는 manifest 파일이라는 것을 만들어낸다. 이 manifest 파일은 만들어진 프로그램이 어떤 .NET Framework Assemblies를 사용하는지 그리고 그 버전은 무엇인지, 또 의존성은 어떻게 되는지 등등등을 설명하고 있다. 한번이라도 VS2005를 이용해서 프로그램을 만들어 본 사람이라면 Debug 혹은 Release 폴더에 manifest 라는 단어가 들어가 있는 파일이 생성된 것을 보았을 것이다. 그 파일을 열어서 보게 되면 안에 내용중에 이런 부분이 있다,

<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762"
processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

이것이 바로 .NET Assemblies 중에 어떤 버전을 사용하고 있는지 그리고 Debug인지 Release인지, 또 x86인지 아닌지, 게다가 publickey 까지 자세히 보여주고 있다. 여기서 주목할 것은 name과 version이다. 윈도우 폴더 아래에 있는 WinSxS 라는 폴더를 열어보자. 여기를 열어보면 저 name과 비슷한 폴더들이 보인다. 그리고 폴더 이름뒤에 version 번호도 보인다. 바로 WinSxS 폴더가 현재 컴퓨터에 설치되어 있는 Shared Side-by-Side Assemblies를 모두 보여준다. 한마디로 이 컴퓨터에서 제공되는 모든 .NET Framework Assemblies를 담고 있는 폴더인 셈이다. 만약 어떤 프로그램을 실행했는데 터무니 없게도 This system cannot execute from this program.이라는 에러가 터진다면 가장 먼저 실행 파일과 함께 있는 manifest 파일을 열어보자. 그리고 그 컴퓨터의 WinSxS 폴더를 열어서 해당 어셈블리가 존재하는지 확인하자.

manifest 파일에 나와있는 Version과 같은 폴더가 존재하지 않는다면 이 컴퓨터는 프로그램을 돌리기 위한 자료가 없기 때문에 실행할 수 없다는 '어이가 없는' 에러 메세지를 내 보낸다. 이것을 해결하기 위한 방법은 아래와 같다.

  1. 만약 컴퓨터에 VS 2005나 VS 2008이 설치되어 있다면 업데이트를 해라. (업데이트를 하면 새로운 버젼의어셈블리들이 자동으로 설치된다.)
  2. Manifest를 열어서 해당되는 버젼의 DLL 파일을 찾아서 실행파일이 있는 폴더에 복사해 넣어라. 이것은 100% 된다고 장담할 수 없다. .NET Framework가 설치조차 안되어 있다면 아마도 작동 안될 것이다.
  3. Microsoft Visual C++ Redistribution (재배포) Package 를 다운받아 설치하라.

Redistribution Package 설치가 가장 합리적인 방법인데 구글에서 Visual C++ Redistribution package를 검색하면 Visual Studio 2005와 2008버전에 대한 각각의 다운로드들이 뜬다. 이 파일을 다운로드 하여 설치하면 WinSxS 폴더에 해당 버전의 어셈블리들이 자동으로 설치되며 Visual Studio가 없는 사람들도 프로그램을 돌릴수 있게 된다.

WinSxS(Windows Side By Side) Assembly (Manifest)

MSVC 컴파일 옵션에서 MT 또는 MTD 가 아닌, MD 또는 MDD 로 컴파일할때 매니페스트관련 문제가 발생할 수 있다. 정확히 말하자면 VS2005 부터는 CRT나 MFC, ATL DLL을 쉽게 못쓴다.

Manifest (.NET Framework)

An assembly manifest is a text file containing metadata about .NET assemblies. It describes the relationship and dependencies of the components in the assembly, versioning information, scope information and the security permissions required by the assembly. The manifest information embedded within an assembly can be viewed using IL Disassembler (ILDASM.exe) which is available as part of Microsoft Windows SDK.

MD 또는 MDD 를 사용할때의 해결책

배포할려는 exe의 .manifest 파일을 열어보자 (XML이다). 표준 DLL이 쓰이고 있다면 그 버전을 확인한다. exe 파일이 있는 폴더에 해당 버전의 dll 들이 있는지 확인한다. 없다면 Windows\WinSxS 폴더에 있는지 확인한다. (Windows\System32 는 VS2005 부터 신경 안써도 됨) DLL 들이 없어서 프로그램이 실행되지 않는다면 다음의 검색어를 통해 최신 버전의 MFC, CRT, ATL DLL 배포판들을 얻는다.

Keyword

  • Microsoft Visual C++ 2005 Redistributable
  • Microsoft Visual C++ 2008 Redistributable
  • Microsoft Visual C++ 2010 Redistributable

See also

Favorite site