출처:
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 은 정의가 되어있는데 뭘또 정의하고 있지
혹시 몰라 다음 구문을 주석 처리했다.
뚜둥!! 프로그램이 정상적으로 돌아간다.
'Programming' 카테고리의 다른 글
C++Builder 6 Personal - sn & 설명 (0) | 2014.04.11 |
---|---|
C++Builder 6 Personal : sn & 설명 (0) | 2013.12.13 |
google.com에서 open source project 참여 검색결과 (0) | 2013.12.03 |