ClickOnce] How to use QueryStringParameter in ClickOnce MS] Setup & Deploy

Q] ClickOnce 의 설치 Folder 를 변경할 수 없을까요?

ClickOnce 의 설치 Location 은 다음과 같습니다.

  • On XP : %userprofile%\Local Settings\Apps (e.g. C:\Documents & Settings\kikiwaka\Local Settings\Apps)
  • On VISTA: %userprofile%\AppData\Local\Apps (e.g. C:\users\kikiwaka\AppData\Local\Apps)

중요한 것은 실제 설치되는 Folder 위치입니다. 이 위치는 Application Cache 로서, 지정할 수도 없으며 찾을 수 있는 방법 또한 존재 하지 않습니다. 따라서, Custom 하게 해당 Folder 를 변경하거나, 설치되는 Folder 를 찾을 수 있는 방법이 존재 하지 않습니다.

이는 ClickOnce 의 By Design 입니다.
아래와 같이 이에 대해서는 차기 Version 에서 고려 대상입니다만, 어느 Version 에서 DCR 이 이루어질지는 확인되지 않았습니다. (This feature is under consideration for changes in further releases of Visual Studio but not confirmed for the next release.)

바로가기 정보를 사용해서 해당 Application 의 실행 파일 위치를 찾을 수 있는 방법은 없습니다.
현실적인 대안은 Local 에 설치 되어 있는 실행파일을 직접 실행하는 것이 아닌, Deploy Server 에 있는 Application을 실행하는 방법(URI) 입니다.
http://DeploymentServerURI/myapp.application#myapp.application 와 같은  형태가 될 수 있을 것입니다.

앞서 설명 드린 바와 같이 대부분 ClickOnce 를 재사용 하시는 경우 QueryString을 사용하게 됩니다.
ClickOnce 를 사용하는 배포하는 Application 에 Parameter 를 전달해야 하는 경우, 다음과 같이 QueryString 을 전달하는 Method를 사용하면 됩니다.
예를 들어, http://DeploymentServerURI/myapp.application?usernum=[사번] 이 될 수 있습니다.

1. System.Web / System.Deployment Reference 를 추가합니다.
             using System.Web;
             using System.Collections.Specialized;
             using System.Deployment.Application;

2. 배포 TAB 에서 다음과 같이 ClickOnce Option 을 활성화 합니다.
             Allow URL parameters to be passed to application

http://sypyo-001:8080/ClickOnceQueryString.application?Name=SungYongPyo&Num=01

와 같이 실행하게 되면,

의 결과를 가져오게 됩니다.

Source 는 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Collections;
using System.Collections.Specialized;
using System.Deployment.Application;

namespace ClickOnceQueryString
{
    class Program
    {
        public static NameValueCollection GetQueryStringParameters()
        {
            NameValueCollection nameValueTable = new NameValueCollection();

            if (ApplicationDeployment.IsNetworkDeployed)
            {
                string queryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
                nameValueTable = HttpUtility.ParseQueryString(queryString);
            }
            return (nameValueTable);
        }

        static void Main(string[] args)
        {
            NameValueCollection NVC = new NameValueCollection();
            NVC = GetQueryStringParameters();

            if (NVC.Count > 0)
            {
                foreach (String key in NVC.AllKeys)
                    Console.WriteLine("Key : {0}", key);

                Console.WriteLine("Key=Name : Item={0} using Item Property", NVC["Name"]);
                Console.WriteLine("Key=Num : Item={0} using Item Property", NVC["Num"]);
                Console.WriteLine("Key=Name : Item={0} using Get() Method", NVC.Get("Name"));
                Console.WriteLine("Key=Name : Item={0} using Get() Method", NVC.Get("Num"));
            }

            Console.ReadLine();

         }
    }
}


덧글

댓글 입력 영역