성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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'>.NET 5 응용 프로그램에서 WinRT API 호출</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;' > Calling Windows APIs in .NET5 ; <a target='tab' href='https://blogs.windows.com/windowsdeveloper/2020/09/03/calling-windows-apis-in-net5/'>https://blogs.windows.com/windowsdeveloper/2020/09/03/calling-windows-apis-in-net5/</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 예전에도 이에 대한 소개를 몇 번 했는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 일반 닷넷 프로젝트에서 WinRT API를 호출하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1508'>https://www.sysnet.pe.kr/2/0/1508</a> 윈도우 데스크톱 응용 프로그램(예: Console)에서 알림 메시지(Toast notifications) 띄우기 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11073'>https://www.sysnet.pe.kr/2/0/11073</a> 데스크톱 윈도우 응용 프로그램에서 UWP 라이브러리를 이용한 비디오 장치 열람하는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11284'>https://www.sysnet.pe.kr/2/0/11284</a> </pre> <br /> .NET 5의 경우 Preview 8부터 새로운 TFM(Target Framework Monikers)을 추가해 별도의 NuGet 라이브러리 참조 없이 연동하게 만들었다고 합니다.<br /> <br /> 간단하게 실습을 해보면, .NET 5 대상의 Windows Forms 프로젝트를 만든 후, TargetFramework에 다음과 같이 "net5.0-windows10..." TFM을 지정하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework><span style='color: blue; font-weight: bold'>net5.0-windows10.0.17763.0</span></TargetFramework> <UseWindowsForms>true</UseWindowsForms> </PropertyGroup> </Project> </pre> <br /> TFM에 지정 가능한 버전은 (<a target='tab' href='https://docs.microsoft.com/en-us/windows/uwp/whats-new/windows-10-build-19041'>Windows 10의 최신 버전이 19041이므로</a>) 3가지입니다.<br /> <br /> <ul> <li>10.0.17763.0</li> <li>10.0.18362.0</li> <li>10.0.19041.0</li> </ul> <br /> 이렇게 TFM을 바꾸면 프로젝트의 의존성에 "<a target='tab' href='https://www.nuget.org/packages/Microsoft.Windows.SDK.NET.Ref/'>Microsoft.Windows.SDK.NET.Ref</a>"가 자동으로 추가됩니다. 이후 일반적인 WinRT 응용 프로그램처럼 Windows 10 API를 가져다 쓸 수 있습니다.<br /> <br /> 일례로 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/11073'>윈도우 데스크톱 응용 프로그램(예: Console)에서 알림 메시지(Toast notifications) 띄우기</a>" 글에서 소개한 Toast 알림을 다룬 그 소스 코드 그대로 다음과 같이 복사해 쓸 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using System.Windows.Forms; using Windows.Data.Xml.Dom; using Windows.UI.Notifications; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ShowToast($"{nameof(WindowsFormsApp1)}", DateTime.Now.ToLongTimeString(), "Test Message", null); } static void ShowToast(string appId, string title, string message, string image) { XmlDocument toastXml = ToastNotificationManager.GetTemplateContent( string.IsNullOrEmpty(image) ? ToastTemplateType.ToastText02 : ToastTemplateType.ToastImageAndText02); XmlNodeList stringElements = toastXml.GetElementsByTagName("text"); stringElements[0].AppendChild(toastXml.CreateTextNode(title)); stringElements[1].AppendChild(toastXml.CreateTextNode(message)); if (string.IsNullOrEmpty(image) == false) { // Specify the absolute path to an image String imagePath = "file:///" + image; XmlNodeList imageElements = toastXml.GetElementsByTagName("image"); imageElements[0].Attributes.GetNamedItem("src").NodeValue = imagePath; } ToastNotification toast = new ToastNotification(toastXml); toast.Activated += Toast_Activated; toast.Dismissed += Toast_Dismissed; toast.Failed += Toast_Failed; ToastNotificationManager.CreateToastNotifier(appId).Show(toast); } private static void Toast_Failed(ToastNotification sender, ToastFailedEventArgs args) { } private static void Toast_Dismissed(ToastNotification sender, ToastDismissedEventArgs args) { } private static void Toast_Activated(ToastNotification sender, object args) { } } } </pre> <br /> 물론, 원문 글(<a target='tab' href='https://blogs.windows.com/windowsdeveloper/2020/09/03/calling-windows-apis-in-net5/'>Calling Windows APIs in .NET5</a>")에서처럼 <a target='tab' href='https://www.sysnet.pe.kr/2/0/1508'>GPS 장치를 접근</a>하는 것도 가능하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private async void button2_Click(object sender, EventArgs e) { var locator = new Windows.Devices.Geolocation.Geolocator(); var location = await locator.GetGeopositionAsync(); var position = location.Coordinate.Point.Position; var latlong = string.Format("lat:{0}, long:{1}", position.Latitude, position.Longitude); MessageBox.Show(latlong); } </pre> <br /> (원문에서는 WPF 프로젝트였지만) 카메라 접근으로 사진 찍는 기능도 다음과 같이 쉽게 구현할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > private async void button3_Click(object sender, EventArgs e) { // Initialize the webcam MediaCapture captureManager = new MediaCapture(); await captureManager.InitializeAsync(); ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg(); // create storage file in local app storage StorageFile file = await KnownFolders.CameraRoll.CreateFileAsync("TestPhoto.jpg", CreationCollisionOption.GenerateUniqueName); // take photo await captureManager.CapturePhotoToStorageFileAsync(imgFormat, file); Bitmap bitmap = new Bitmap(file.Path); pictureBox1.Image = bitmap; } </pre> <br /> <img alt='net5_winrt_sample_1.png' src='/SysWebRes/bbs/net5_winrt_sample_1.png' /><br /> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1690&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 암튼, 간단해져서 좋습니다. ^^ 기존에는 System.Runtime.WindowsRuntime.dll이나 Windows.winmd 파일 등을 신경써야 했는데 이제는 단순히 적절한 TFM만 지정하는 것으로 모든 준비 작업이 끝납니다.<br /> <br /> 참고로, 하나의 프로젝트 파일로 .NET Core 3.1과 .NET 5 지원을 모두 추가할 수 있습니다. 이를 위해 프로젝트 파일만 다음과 같이 살짝 바꾸면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFrameworks><span style='color: blue; font-weight: bold'>netcoreapp3.1;net5.0-windows10.0.19041.0</span></TargetFrameworks> <UseWPF>true</UseWPF> </PropertyGroup> <ItemGroup> <PackageReference <span style='color: blue; font-weight: bold'>Condition="'$(TargetFramework)' == 'netcoreapp3.1'" Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.0"</span> /> </ItemGroup> </Project> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1272
(왼쪽의 숫자를 입력해야 합니다.)