출처:


Manifest 파일은 만들어진 프로그램이 이떤 .Net Framework Assemblies 를 사용하는지 그리고 버젼은 무엇인지 

또 의존성은 어떻게 되는지를 설명 하는 파일이다.

 

프로젝트를 빌드하면 Debug 폴더에 manifest 라는 파일이 생성된다.

 

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

 

manifest 파일의 내용이다.

XML 형태로 저장 되어 있다.

 

위에 빨간 색으로 기술된 부분이 .net Assemblies 중 어떤 버젼을 사용하고 있는지 debug 인지 release 인지 또 x86 인지 자세히 보여준다.

여기서 주목할 점은 name 과 version 이다.

 

윈도우 폴더 아래에 WinSxS 폴더가 현재 설치 되어 있는 Shared side-by-side assemblies 를 모두 보여준다.

 

실행 후 "this system cannot execute from this program"

 

이라는 에러가 터진다면 manifest 파일을 열고 컴퓨터 WinSxS 폴더를 열어 해당 어셈블리가 있는지 파악한다.

 

만약 존재 하지 않는다면

1. 업데이트 하여 어셈블리 를 자동으로 설치한다.

2. Microsoft Visual C++ Redistribution (재배포) package 를 다운 받아 설치해라

 

visual studio 가 없는 사람들도 프로그램을 돌릴수 있게 된다.

 

그런데 manifest 파일을 만드는 rc 파일이 꼬여 다음과 같은 에러를 내뱉을수 있다.

 

CVTRES : fatal error CVT1100: duplicate resource.  type:MANIFEST, name:1, language:0x0409

fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

 

먼저 뜻을 보면 rc 파일의 manifest 쪽 이름이 1인 것이 중복되었다고 나온다.

 

찾아가봤다

프로젝트이름.rc -> 우클리-> view code 해서 열어 보면

 

 

1 TEXTINCLUDE DISCARDABLE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "#ifdef _WIN32\r\n"
    "LANGUAGE 9, 1\r\n"
    "#pragma code_page(1252)\r\n"
    "#endif //_WIN32\r\n"
    "#include ""afxres.rc""         // Standard components\r\n"
    "#endif\r\n"
    "\0"
END

 

다음과 같은 내용이 나온다.

근데 여기서 1이란 첫번째를 의미 하는것 같은데 이게 중복되었다......

밑에 가보니

 

1                       24      MOVEABLE PURE   "app.manifest"

 

이런 구문이 있다. 뭐지...1 은 정의가 되어있는데 뭘또 정의하고 있지

 

혹시 몰라 다음 구문을 주석 처리했다.

 

뚜둥!! 프로그램이 정상적으로 돌아간다.

 

 

 

Posted by 세모아
,