오늘은 지난 소스를 보던 중 괜찮은 부분이 눈에 띄어 또 써먹을 곳이 있지 않을까 하여 Posting 해 봅니다.
인터넷 어디선가 Copy 해온 소스인 것 같기도하고... (제가 만들었을리가... ^^;)
다른 곳에서 유사한 소스를 분이 계시다면... 알려주셔요... Link 를 걸도록 하겠습니다.
image 파일을 동적으로? 넣어야 할 일이 생겼습니다.
"동적으로" 라는 말에 "?" 를 붙인 이유는
앞으로 진행할 작업이 동적이라고는 하지만 XML 파일에 추가를 시켜줘야하고, 이미지 파일을 Embedded Resource 로 등록을 해줘야 하기 때문입니다. ㅋㅋㅋ
그럼 다시 컴파일을 해줘야 하니까요...
위와 같이 image 들을 Embedded Resource 로 등록을 하게되면 (Build Action 을 Embedded Resource 로 설정해 놓은 것을 확인하자)
저번 Article 에서 언급했듯이
Reflector 를 이용해서 살펴보게되면 assembly 내에 아래 그림과 같이 등록되어 있는 것을 알 수 있다.
(실행파일을 만들면 좋겠지만 귀차니즘으로 인해 현재 제작중인 Application 의 내용을 Capture 를 하다보니 수정하고 손으로 편집하고... 그래서 좀 조잡하네요. 이해해 주세용 ^^' )
그럼 imagelist control 에 등록할 이미지들이 어떤 것들인지 정의할 XML 파일의 내용을 보면 아래와 같다.
<CTypes>
<CTypevalue ="10">Black</CType>
<CType value ="11">Blue</CType>
<CType value ="12">Red</CType>
<CType value ="13">Green</CType>
<CType value ="14">Cyan</PType>
</CTypes>
위 녀석을 읽어서 아래와 같이 Loop 를 돌면서 imageList Control 에 Add 한다.
이 파일에서 requestedExecuteionLevel 의 level 값이 중요한데 기본적으로 "asInvoker" 로 되어 있다.
이 값은 UAC 상승없이 실행하며 호출 Process 의 권한을 이용하도록 되어있다.
따라서 나같은 경우 Application 의 Debug 가 VisualStudio 의 UAC 를 바탕으로 실행이 되었으므로 UAC 가 상승되어 있는 상태였으므로 맘대로 Registry 를 건드릴수 있었던 것이다.
다른 값으로 "highestAvailable" 이 있는데 이것은 호출 Process 가 가지고 있는 권한 중 가장 높은 권한을 사용하는 옵션이다.
여기서 내가 사용할 값은 "requireAdministrator" 으로 실행시 관리자 권한으로 UAC 상승을 요청하도록 하는 옵션인데 따라서 확인창이 뜨게 된다.
내가 사용하는 방법을 간단히 소개를 했는데...
위 방법을 사용하려면 먼저 manifest 파일을 얻어야 한다.
간단히 얻는 방법이 있다.
woojja.exe 의 실행파일인 경우 실행파일이 컴파일되는 Target Folder 에 가보면 ("bin" Folder 에 "Debug", "Release" Folder)
woojja.vshost.exe.manifest 라는 파일이 보일 것이다.
ㅋㅋㅋ 이것을 사용하자.
파일을 복사하여 "woojja.exe.manifest" 라는 이름의 파일로 만들자...
그리고 파일을 열어
requestedExecuteionLevel 의 level 값을 "asInvoker" 에서 "requireAdministrator" 로 수정하자.
저장하고...
이제 mt.exe 를 실행시켜야 할 것이다.
mt.exe 파일의 위치는
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin"
에 있다.
Version 에 따라
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin" 에도 존재한다.
그렇다면 이제 Assembly 에 있는 Resource 에 접근하는 방법을 알아봐야 할텐데...
"Show All Files" 아이콘을 클릭하면 숨겨져 있는 파일을 모두 볼수 있는데.. Assembly 전체에서 사용하는 Resources.resx 의 Designer code 파일을 보도록 하자...(Resources.Designer.vb)
이 파일을 열어보면... 아래와 같이 Resource 들을 접근하기위한 Property 가 주~~욱 나열되어 있는 것을 확인할 수 있다.
위 그림처럼... Resources.resx 파일을 클릭해보면 아래 Properties 창에 "Custom Tool" 이라는 항목이 나오는데...
값을 보면... VbMyResourcesResXFileCodeGenerator 라는 녀석이 있는데...
바로 이녀석이 자동적으로 Generating 해주는 역할을 한다.
이 녀석이 Resource 의 이름. 즉, String 을 건네주면 값을 반환하는 Function 같은 것을 지원해주면 좋으련만...
그런 함수를 지원하지 않기 때문에...
내가 손으로 직접 만들어 주려고 한다. ㅋㅋㅋ
그럴려면...
VisualBasic.NET 의 경우 Resource 에 어떻게 접근할까?
위에서 봤듯이... Custome Tool 에 의해서 쉽게 접근 할 수 있다..
VisualBasic.Net 의 경우 My Namespace 를 사용하면 쉽게? 접근할 수 있는데...
DimimgAsSystem.Drawing.Image = My.Resources._10
이런식으로 하면 바로 이미지를 가져올 수 있다.
하지만 나는 XML 파일의 String 값을 기반으로 실행을 하려고 했으므로...
VbMyResourcesResXFileCodeGenerator 라는 녀석이 만들어낸 "Resources.Designer.vb" 파일을 참고삼아..
모듈을 만들고 몸뚱이에... 함수를 추가하여 엇비슷하게 사용할까 한다. ㅋㅋㅋ
(완전 단순 무식... ^^')