Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

UWP(Universal Windows Platform) 응용 프로그램의 새로운 라이브러리 버전 관리 해법

어제 들었던 빌드(Build) SEOUL 세미나에서, 다음과 같은 재미있는 상황을 보았습니다.

uwp_type_present_1.png

// Guide to Universal Windows Platform (UWP) apps
// ; https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide
//
// What's a Universal Windows Platform (UWP) app?
// ; https://docs.microsoft.com/en-us/windows/uwp/get-started/universal-application-platform-guide

bool isHardwareButtonsAPIPresent =
        Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");

    if (isHardwareButtonsAPIPresent)
    {
        Windows.Phone.UI.Input.HardwareButtons.CameraPressed +=
            HardwareButtons_CameraPressed;
    }

이상하지 않나요? ^^

Windows.Phone.UI.Input.HardwareButtons 타입이 정의된 "WindowsMobile.dll"을 참조 추가했을 뿐만 아니라, "Windows.Phone.UI.Input.HardwareButtons" 타입이 있는지 검사하고는 곧바로 아래에서 '정적 타이핑'으로 해당 코드를 사용하고 있습니다.

일반적인 닷넷 응용 프로그램에서는 위의 코드가 포함된 메서드(위의 예에서는 OnNavigatedFrom)가 실행되는 순간, JIT 컴파일러는 해당 메서드 내에 포함된 타입들을 모두 찾게(resolve) 되어 있습니다. 그런 이유로 때론 다음과 같은 고생을 하게 되는 것이고.

System.MissingMethodException
; https://www.sysnet.pe.kr/2/0/909

Method not found: 'Void System.Reflection.Emit.DynamicMethod..ctor(System.String, System.Type, System.Type[])'.
; https://www.sysnet.pe.kr/2/0/809

세미나 후, 최근 ^^ '나는 프로그래머다'로 인지도가 높아지신 마이크로소프트의 김명신 부장님께,

Episode 5: 마이크로소프트 특집 2부 - 마이크로소프트 에반젤리스트 김명신님과 함께
; https://iamprogrammersite.wordpress.com/2015/05/18/episode-5-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%86%8C%ED%94%84%ED%8A%B8-%ED%8A%B9%EC%A7%91-2%EB%B6%80-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%86%8C%ED%94%84%ED%8A%B8-%EC%97%90%EB%B0%98/

이에 대한 질문을 하니... 그 부분은 인터페이스로 대체된다는 답변을 들었습니다. 음... 그래도 혹시나... 이번에 바뀐 JIT 컴파일러인 RyuJIT의 개선점이 아닐까 싶어 한번 확인을 해보았는데요. ^^ 실제로, "WindowsMobile.dll"을 참조했지만 컴파일된 결과물을 보면,

uwp_type_present_2.png

"WindowsMobile.dll" 참조는 온데간데 없고 "Windows.Phone.PhoneContract"로 변경되어 있었습니다. Windows.Phone.PhoneContract는 닷넷 어셈블리는 아니고 WinMD 확장자를 가진 Windows Runtime 구성 요소입니다. 즉, 김명신 부장님의 답변대로 COM 기반의 라이브러리인 셈입니다.

아쉽게도 닷넷 응용 프로그램에서는 여전히 System.MissingMethodException 예외를 봐야하겠지만, UWP 응용 프로그램은 이런 제약에서 벗어났다는 점에서는 긍정적인 것 같습니다. (닷넷도 저렇게 할 수 있게 되면 얼마나 좋을까요? ^^)

참고로, IsTypePresent 뿐만 아니라 IsEventPresent, IsMethodPresent, IsPropertyPresent에 대한 메서드도 제공되니 라이브러리 참조에 관한 버전 문제는 UWP에서 볼 수 없게 되었습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/17/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2015-06-17 02시31분
[박중석] 아 이 내용 올려주셔서 감사합니다! 저도 덕분에 배우고 갑니다.
[guest]
2015-06-17 03시26분
^^ 저도 세미나를 통해서 좋은 것 배웠습니다.
정성태

... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11209정성태5/25/201770222Windows: 143. Windows 10의 Recovery 파티션을 삭제 및 새로 생성하는 방법 [16]
11208정성태5/25/201728985오류 유형: 390. diskpart의 set id 명령어에서 "The specified type is not in the correct format." 오류 발생
11207정성태5/24/201729846Windows: 142. Windows 10의 복구 콘솔로 부팅하는 방법
11206정성태5/24/201723032오류 유형: 389. DISM.exe - The specified image in the specified wim is already mounted for read/write access.
11205정성태5/24/201722726.NET Framework: 658. C#의 tail call 구현은? [1]
11204정성태5/22/201732253개발 환경 구성: 316. 간단하게 살펴보는 Docker for Windows [7]
11203정성태5/19/201719589오류 유형: 388. docker - Host does not exist: "default"
11202정성태5/19/201720729오류 유형: 387. WPF - There is no registered CultureInfo with the IetfLanguageTag 'ug'.
11201정성태5/16/201724235오류 유형: 386. WPF - .NET 3.5 이하에서 TextBox에 한글 입력 시 TextChanged 이벤트의 비정상 종료 문제 [1]파일 다운로드1
11200정성태5/16/201721026오류 유형: 385. WPF - 폰트가 없어 System.IO.FileNotFoundException 예외가 발생하는 경우
11199정성태5/16/201722245.NET Framework: 657. CultureInfo.GetCultures가 반환하는 값
11198정성태5/10/201724211.NET Framework: 656. Windows Forms의 오류(Exception) 처리 방법에 대한 차이점 설명
11197정성태5/8/201720514개발 환경 구성: 315. VHD 파일의 최소 크기파일 다운로드1
11196정성태5/4/201721931오류 유형: 384. Msvm_ImageManagementService WMI 객체를 사용할 때 오류 상황 정리 [1]
11195정성태5/3/201722683.NET Framework: 655. .NET Framework 4.7 릴리스
11194정성태5/3/201724182오류 유형: 383. net use 명령어로 네트워크 드라이브 연결 시 "System error 67 has occurred." 오류 발생
11193정성태5/3/201722187Windows: 141. 설치된 Windows로부터 설치 이미지를 만드는 방법
11192정성태5/2/201723562Windows: 140. unattended.xml/autounattend.xml 파일을 마련하는 방법
11191정성태5/2/201724374Windows: 139. Dell Venue 8 Pro 태블릿에 USB를 이용한 윈도우 운영체제 설치 방법
11190정성태5/2/201729797Windows: 138. Windows 운영체제의 ISO 설치 파일에 미리 Device driver를 준비하는 방법
11189정성태5/2/201721168Windows: 137. Windows 7 USB/DVD DOWNLOAD TOOL로 98%에서 실패하는 경우
11188정성태4/27/201723932VC++: 118. Win32 HANDLE 자료형의 이모저모 [1]
11187정성태4/26/201724829개발 환경 구성: 314. C# - PowerPoint 확장 Add-in 만드는 방법 [1]파일 다운로드1
11186정성태4/24/201722770VS.NET IDE: 117. Visual Studio 확장(VSIX)을 이용해 사용자 매크로를 추가하는 방법 [1]파일 다운로드1
11185정성태4/22/201720378VS.NET IDE: 116. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법 (2) - 동적 메뉴 구성파일 다운로드1
11184정성태4/21/201722063VS.NET IDE: 115. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법파일 다운로드1
... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...