ClickOnce로 게시된 .app-ms에 다른 프로그램의 Arguments 값 받아오기
시작하기 앞서 이해가 필요한 부분이 있어 ClickOnce에 관련해서 먼저 설명드립니다.
문제점 1
먼저, IIS를 통해 ClickOnce로 게시된 프로그램은 설치 경로를 변경할 수 없습니다.
뿐만 아니라 디렉토리 명칭이 암호화되어 난수와 문자로 길게 나열된 파일이름으로 생성되고, 이는 설치한 PC마다 각각 다른 디렉토리명칭을 가지고 있습니다.
이 때문에 ProcessStartInfo 를 이용하여 .exe 파일을 실행시키며 Agrument를 넘기는 것은 일반적인 방법으로 불가능합니다.
문제점 2
여기서 할 수 있는 방법은 고정된 경로에 실행파일을 만들어 주는 것 입니다.
다행히도 ClickOnce에는 고정된 경로에 바로가기(shortcut)를 만들 수 있습니다.
하지만 여기서 또 하나의 문제는 바로가기의 파일 확장자명이 .exe 가 아닌 appref-ms 라는 점입니다.
해결방안
1. 고정된 경로에 바로가기(.appref-ms)를 생성한다.
2. 바로가기(.appref-ms) 프로그램이 실행된 뒤 Arguments를 받을 수 있도록 소스를 작성한다.
(*ClickOnce로 .exe 파일을 고정된 경로에 생성하는 방법은 찾지 못함)
문제 해결 시작
▶실행되는 프로그램
1. 바로가기가 생성될 경로를 아래와 같은 방법으로 정해줍니다.
1) [프로젝트] > [속성] 클릭
2). [게시] > [옵션] > [설명] 에 아래와 같이 입력하면 아래와 같은 경로에 바로가기가 생성됨
C:\Users\PC이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\게시자이름\제품군이름.appref-ms
2. 실행될 프로그램 소스를 아래와 같이 수정해줍니다.
if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null) return;
string str = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
Properties.Settings.Default.sID = str;
1) Arguments가 Null일 경우를 예방하기 위해 if문으로 예외처리함
2) AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0] 를 통해
실행시킨 프로그램으로 부터 하나의 Arguments를 str 라는 string형 변수로 받음
(아래 참고링크에서 하나만 받을 수 있다는 글로 보아 여러개를 받는 것은 안되는 것같습니다.
따라서 ActivationData[0] 처럼 인덱스가 0인 배열에 Arguments 값이 들어있습니다. )
Processing Command Line Arguments in an Offline ClickOnce Application
Several years ago when ClickOnce first emerged I thought it was a great idea. Unfortunately at the time, I found it so difficult and tedious that I didn’t play with it for long. My budd…
developingfor.net
3) 미리 선언해 두었던 글로벌 변수 sID 에 str 값을 넣음
(*Program.cs 나 MainForm 실행단에 소스를 넣는 것을 추천드립니다.)
- .exe일 경우 Program.cs 의 Main 함수에 string형 배열로 argument를 받을 수 있다.
static void Main(string[] args)
{
if (args.Length > 0)
{
Properties.Settings.Default.sID = args[0];
}
}
3. 아래와 같이 게시하여 바로가기를 고정된 경로에 생성합니다.
1) 게시옵션 > 매니페스트에 [응용 프로그램으로 URL 매개 변수가 전달되도록 허용] 체크하기
2) 게시 > 설치 모드 및 설정에 [온프라인으로도 응용 프로그램 사용 가능([시작] 메뉴에서 시작 가능)] 체크하기
3) 게시 후 아래 경로에 생성된 바로가기 확인
▶실행시키는 프로그램
1. 아래와 같이 소스를 작성한다.
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Users\PC이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\게시자이름\제품군이름.appref-ms";
psi.Arguments = sID;
Process.Start(psi);
이 처럼 appref-ms를 실행시키면, ClickOnce로 배포된 버전을 자동 업데이트를 할 수 있다.(Url 접속방식)