개발노트

ClickOnce로 게시된 .app-ms에 다른 프로그램의 Arguments 값 받아오기 본문

미분류 노트

ClickOnce로 게시된 .app-ms에 다른 프로그램의 Arguments 값 받아오기

mroh1226 2022. 12. 23. 10:23
반응형

 

실행 중인 프로그램으로부터 인수를 전달받아 .appref-ms 프로그램 실행 후, 받아온 인수 활용하기

 

시작하기 앞서 이해가 필요한 부분이 있어 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 값이 들어있습니다. )

 

- 참고 링크: https://developingfor.net/2010/06/23/processing-command-line-arguments-in-an-offline-clickonce-application/

 

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) 게시 후 아래 경로에 생성된 바로가기 확인

 

C:\Users\PC이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\게시자이름\제품군이름.appref-ms

 

 

 


▶실행시키는 프로그램

 

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 접속방식)

 

 

 

 

반응형
Comments