Internet Explorer 와 더불어 ActiveX가 사라진 지도 오래(?)됐지만 아직도 웹을 통해 로컬 프로그램을 실행하거나 로컬 컴퓨터를 제어해야 하는 상황은 왕왕 생긴다. 시대가 변하면서 영상, 음악, 심지어 게임에 이르기까지 상당히 많은 것들이 HTML5의 힘을 빌어 웹 환경으로 통합되긴 했지만, 여전히 웹으로 모든 것을 다 할 수는 없기 때문이다. (뭐 그렇다 해도 공인 인증서를 띄우기 위해 로컬 프로그램을 설치하고 실행하는 건 여전히 개닭짓으로밖에 보이지 않지만...)
.NET Framework 환경에서는 Smart Client라는, ActiveX와 유사한 개념의 프로그램 제작 및 실행방법이 있긴 하지만 이것 역시 Internet Explorer와 함께 역사의 뒤안길로 사라졌고... 쓸 수 있다 하더라도 역시 여러가지 보안 관련 문제 등으로 인해 한계가 뚜렷하다.
사설이 길었는데, 웹에서 로컬 프로그램을 실행할 방법은 이제는 한 가지 방법만이 남았다.
바로 URI Scheme 혹은 URL Protocol 연결 프로그램.
관련해서, 예전에 아래와 같은 글을 쓴 적이 있다.
https://thermidor.tistory.com/1346 - 사용자 정의 URI Scheme 연결 프로그램 |
글 말미에 간략하게 실행하는 방법을 적긴 했지만 구체적으로 쓰진 않았는데 요즘 갑자기 해당 프로그램을 만들 일이 생겨서 하나 만들었는데, 관련해서 모은 정보를 남겨 본다.
>> 참조: https://www.meziantou.net/registering-an-application-to-a-uri-scheme-using-net.htm
C#으로 만드는 방법은 위 링크 하나면 일단 끝.
매우 간단하다.
thermidor://network?target=10.0.0.1
뭐 이런 식으로 URI Scheme 링크를 걸었다면, 실제 프로그램으로 전달된 링크(명령줄 args[0])는 Uri 객체로 캐스팅(TryCreate)한 다음 Scheme, Authority, Path 등의 속성을 사용하면 쉽게 처리할 수 있다.
웹에서는 그럼 어떻게 링크를 걸고 프로그램 다운로드 및 실행을 시킬 수 있을까?
여기에는 특별한 아이디어가 필요한데...
- URI Scheme으로 일단 프로그램을 실행해 보고
- 실행이 안되면 프로그램(압축파일)을 다운로드하게 한다
2번 같은 경우, 좀 더 완성도 높은 프로그램이 되려면 ClickOnce 등으로 자동으로 업데이트/실행되는 방식으로 만들어도 될 것 같긴 한데 여기서는 그렇게까지 고려하진 않도록 하겠다.
자, 그런데!
URL Scheme 으로 프로그램을 실행해 보고 안되면 다운로드하게 한다?
이게 쉬워보이지만 의외로 어렵다.
이미 수많은 사람들이 도전해 보고 포기하고 또 도전해 보고 있는 모양.
왜냐하면 URI Scheme 링크가 동작하지 않더라도 오류가 발생하지 않아서 try ~ catch로 처리할 수 없기 때문이다.
딱 하나.
중간 쯤에 있는 채택된 답변(실제로는 쓸모 없는 답변)에 달린 댓글 하나가 괜찮은 아이디어였다.
바로 이것.
내 경우에는 Microsoft Edge나 Google Chrome 환경에서만 제대로 동작되게 하면 되는 방식이면 충분해서 Chrome 부분만 차용해서 사용했다. 페이지 상에서 포커스를 받을 수 있는 <input type="button"> 태그 부분을 elem으로 넘겨줬더니...
성공!
즉, 외부 프로그램이 실행되면 해당 버튼이 포커스를 잃을 테니 정상 실행된 것이고, 포커스를 잃지 않는다면 프로그램이 설치되지 않았다는 뜻이므로 다운로드하도록 유도하면 된다는 아이디어. 참 괜찮은 생각이었고 내 상황에도 잘 들어맞았다. 멋지게 잘 동작했다. 나중에 Safari나 Firefox 지원도 필요하면 나머지 부분도 차용해서 쓸 수 있을 것 같다.
'Tech: > .NET·C#' 카테고리의 다른 글
.NET Core 6: WebRequest -> HttpClient 변경 시 주의 사항 (1) | 2023.11.29 |
---|---|
Visual Studio: 경로에 잘못된 문자가 있습니다 (0) | 2023.10.31 |
Visual Studio 2019 ASP.NET Core 하위 호환성 문제 (0) | 2021.01.07 |
Stream 사용 시 기본 유의사항을 또 까먹고... (0) | 2020.12.24 |
ASP.NET Core Html Helper? Tag Helper! (0) | 2020.12.08 |