성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그런 부분은 클라우드 업체 쪽에 문의를 하는 것이 더 좋지 않을...
[정성태] 정적 분석과 함께, 이제는 실행 시 성능 분석까지 (비록 Azu...
[정성태] .NET Source Browser를 이용해 Roslyn 소스 ...
[정성태] Experimental C# Interceptors: AOT &...
[정성태] .NET Conf 2023 (Day 2) - Tiny, fast...
[정성태] The end of the Tye Experiment #1622...
[정성태] This is a simple app that converts ...
[정성태] Wrathmark: An Interesting Compute W...
[정성태] FFmpeg Filters Every Youtuber Needs...
[정성태] 일단, PInvokeStackImbalance 오류가 발생했다는...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법</h1> <p> 예전에 썼던 글에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 필수 무결성 제어를 조절하는 방법(1) - Manifest 파일 이용 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/445'>https://www.sysnet.pe.kr/2/0/445</a> </pre> <br /> <a target='tab' href='https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests'>Application manifest</a> 파일을 사용하는 방법을 설명했는데요, 오랜만에 Visual Studio 2022 환경에서 해보니 달라진 점이 있어 새롭게 정리합니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 우선, Visual C++ Console Application을 만들고 빌드하면, 기본적으로 다음과 같은 manifest가 EXE 파일에 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11228#rt_manifest'>RT_MANIFEST 리소스</a>로 포함됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?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' /> </requestedPrivileges> </security> </trustInfo> </assembly> </pre> <br /> 제 기억으로는, 예전에는 기본적으로 RT_MANIFEST가 포함되지는 않았는데 이제는 저렇게 제공하고 있는 것입니다. 게다가 버전이 "asm.v3"로 바뀌었는데요, 이에 대한 이력을 찾아봐도 ^^; 검색 실력이 안 좋은지 전혀 안 나옵니다. (혹시, asm.v3가 언제부터 나온 것인지 아시는 분은 덧글 부탁드립니다. ^^)<br /> <br /> 자, 그럼 이전 실습처럼 관리자 권한으로 실행하기 위해 'requireAdministrator' 값을 적용한 걸로 대체해 볼까요? ^^ 이를 위해 우선, 프로젝트에 다음과 같은 내용의 add.manifest 파일만 추가합니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?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='<span style='color: blue; font-weight: bold'>requireAdministrator</span>' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> </assembly> </pre> <br /> 재미있는 건, 추가만 했는데도 이제 비주얼 스튜디오는 확장자를 보고 application manifest 파일로 처리하기 때문에 빌드 시 이런 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > LINK : fatal error LNK1327: failure during running mt.exe </pre> <br /> 왜냐하면, 위에서 지정한 requestedExecutionLevel의 level='requireAdministrator' 값이 Visual C++ 프로젝트의 기본 옵션과 다르기 때문입니다. 따라서 이를 맞춰줘야 하는데요, 다음 화면과 같이 "Linker" / "Manifest File"의 "UAC Execution Level"을 "requireAdministrator"로 설정하면 됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='manifest_v3_0.png' src='/SysWebRes/bbs/manifest_v3_0.png' /><br /> <br /> 이후 빌드가 다시 잘 되는데요, 사실 따지고 보면 requireAdministrator를 설정하기 위해 굳이 add.manifest 파일을 추가할 필요도 없었던 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그럼, 위의 경우에 add.manifest 파일이 적용된 것일까요? 아니면 프로젝트의 옵션이 적용된 것일까요? 테스트를 위해 add.manifest 파일에 다음과 같이 추가 설정을 해두고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <!-- [생략] --> <span style='color: blue; font-weight: bold'><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> </application> </compatibility></span> </assembly> </pre> <br /> 빌드한 다음 RT_MANIFEST 리소스를 확인하면 ^^ add.manifest 파일의 내용이 들어간 것을 볼 수 있습니다. 그러니까, <a target='tab' href='https://www.sysnet.pe.kr/2/0/445#add_file'>이전처럼 "Additional Manifest Files" 옵션에 add.manifest 파일을 지정</a>하지 않아도 이제 프로젝트에 추가된 manifest 파일을 자동으로 사용하게 바뀐 것입니다.<br /> <br /> 자, 그럼 manifest 파일을 RT_MANIFEST 리소스로 포함하는 방식을 알아봤으니 외부로 빼는 방식도 알아봐야겠지요. ^^ 이것 역시 간단합니다. 그냥 "add.manifest" 파일을 프로젝트에 포함한 상태에서 단순히 "Embed Manifest" 옵션만 "No"로 설정해 주면 됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='manifest_v3_1.png' src='/SysWebRes/bbs/manifest_v3_1.png' /><br /> <br /> 역시 이번에도 (위의 화면에도 나오지만) "Additional Manifest Files"를 지정하지 않았는데도, 단순히 프로젝트에 포함된 add.manifest 파일을 인식해 그것을 exe와 같은 디렉터리에 파일(예를 들어, ConsoleApplication1.exe.manifest)로 출력해 줍니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그렇다면, 아예 manifest를 사용하지 않으려면 어떻게 해야 할까요?<br /> <br /> 지금 상황에서는 "add.manifest" 파일을 포함하지 않아도, "Embed Manifest"가 Yes인 경우라면 "Linker" / "Manifest File"의 설정을 RT_MANIFEST로 포함할 것이고, "No"라면 [응용_프로그램_이름].exe.manifest 파일로 출력해 줄 것입니다.<br /> <br /> 물론, No로만 설정하고 manifest 파일을 삭제하면 동일할 효과를 갖습니다. 하지만 이런 작업이 귀찮다면 "Linker" / "Manifest File"의 "Generate Manifest" 파일을 "No"로 설정하면 됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='manifest_v3_2.png' src='/SysWebRes/bbs/manifest_v3_2.png' /><br /> <br /> 그럼 manifest 파일 출력도 없고, RT_MANIFEST 리소스도 EXE에 포함하지 않습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 위에서 설명한 LNK1327 에러가 동일한 조건에서 "Embed Manifest" 옵션을 No로 설정하면 오류 메시지가 다음과 같이 달라집니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > manifest authoring error c1010001: Values of attribute "level" not equal in different manifest snippets. </pre> <br /> 따라서 "Linker" / "Manifest File"에서의 설정과 파일로 추가된 manifest 설정을 일치시켜야 합니다.<br /> <br /> 마지막으로, manifest 확장자를 갖는 파일을 추가하면 비주얼 스튜디오는 자동으로 vcxproj 파일에 다음과 같이 추가합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // ...[생략]... <ItemGroup> <<span style='color: blue; font-weight: bold'>Manifest</span> Include="add.manifest" /> </ItemGroup> // ...[생략]... </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1729
(왼쪽의 숫자를 입력해야 합니다.)