|
배포할 응용이 동작하기 위해 필요한 구성 요소에 대한 설치여부
|
배포할 응용프로그램(Windows Form이나 콘솔 응용프로그램)이 동작하기 위해서 필요한 구성 요소에 대한 설치 여부를 말하는데, Click Once는 .NET Framework 3.5기반이기 때문에 OS에 .NET Framework 3.5가 없으면 배포를 할 수 없다.
|
|
Click Once를 이용하는 애플리케이션이 특정 컴퓨터에서 이와 같은 오류를 발생시키는 경우가 있다. 이 에러는 애플리케이션을 테스트할 컴퓨터에 .NET Framework 3.5SP1가 설치되 있지 않을 경우에 발생하는 오류이다.
배포된 애플리케이션이 System.Data.Entity 어셈블리를 사용하도록 설정되어 있다는 의미로 해석되지만, 실제 배포된 애플리케이션 어디에도 System.Data.Entity 어셈블리를 사용하고 있지 않다. |
이와 같은 에러가 발생하는 현상을 재현해보겠다.
Click Once로 배포 시, .NET Framework 3.5가 없는 PC에는 설치여부를 물을 수가 있는데,
예를 들기 위해서 Click Once 애플리케이션을 게시할 수 있는 .NET Framework 3.5 SP1이 설치된 PC와 애플리케이션을 테스트할 수 있는 컴퓨터가 필요하다.
|
r 에러제현 게시 컴퓨터: Visual Studio 2008 SP1 테스트 컴퓨터: .NET Framework 3.5 SP1이 설치되 있지 않아야 함
|
|
Click Once 애플리케이션 작성 |
Click Once 애플리케이션을 배포하기 위해 아무 작업을 하지 않고 그대로 게시를 해보겠다.
|
Click Once 게시 옵션 설정 |
|
[1] 테스트를 위해 다음과 같은 옵션 항목을 설정한다. 1. 설치모드 및 설정은 “오프라인으로도 응용 프로그램 사용 가능”을 선택한다. 2. 필수 구성 요소 창에서 .NET Framework 3.5를 선택한다. 3. 기본적으로 선택되어 있는 .NET Framework 3.5 SP1은 제거한다.
[2] 옵션 버튼을 클릭하고 게시 옵션 대화상자에서 배포 탭을 선택 배포 웹 페이지 항목에 자동 생성될 html 이름을 지정하고, “게시할 때마다 자동으로 배포 우베 페이지 생성”항목을 체크한다.
나머지 옵션의 선택은 영향을 미치지 않는다. |
|
게시 |
|
‘지금 게시’ 버튼을 이용하여 Click Once 애플리케이션을 게시한다. 특별히 게시 위치를 지정하지 않은 경우라면 해당 애플리케이션 폴더 하위에 publish라는 폴더명으로 게시된 애플리케이션이 복사된다. 이렇게 게시된 애플리케이션을 테스트 하기 위해 IIS에 가상 디렉토리를 설정하고 복사한다. |
|
애플리케이션 테스트 |
|
.NET Framework 3,5 SP1이 설치되지 않은 컴퓨터를 실행하고 게시한 URL을 입력한다. [ http://192.168.34.51/ClickOnce/default.htm ]
|
|
|
설치 버튼을 클릭해보면
.NET Framework 3.5를 설치하는 대화상자가 열리는 것을 확인할 수 있다. |
|
.NET Framework가 설치되어 있는 PC에서의 화면 |
|
|
|
배포할 응용이 다른 파일을 사용하는 경우
|
|
배포할 데이터 파일(이미지파일)을 확인하기 위해 Form에 PictureBox를 추가 | |
|
|
예제로 ‘21기의 각오.JPG’파일을 추가
|
|
|
빌드 작업 속성이 ‘내용’이어야 하고, 출력 디렉터리로 복사는 ‘항상 복사’ 또는 ‘변경된 내용만 복사’로 설정해야함 |
|
|
프로젝트의 빌드 작업 속성은 ‘컴파일’로
출력 디렉터리로 복사는 데이터 파일 속성과 동일하게 해준다. |
|
|
게시를 하게 되면 다른 클라이언트 PC에서 해당 이미지파일을 배포 받을 수 있다.
|
파라미터 값 전달하기
|
|
WinForm |
|
static void Main() { . . . Dictionary<string, string> mydic = GetQueryStringParameter(); if (mydic.ContainsKey("memID")) { string memid = string.Format("{0}", mydic["memID"]); //파라미터1 string mempw = string.Format("{0}", mydic["memPW"]); //파라미터2 Application.Run(new Form1(memid, mempw)); //파라미터를 받아 폼생성 } else { Application.Run(new Form1("No_ID","NoPW")); } }
private static Dictionary<string, string> GetQueryStringParameter() //파라미터얻기 { Dictionary<string, string> MemberInfoTable = new Dictionary<string, string>();
try { if (ApplicationDeployment.IsNetworkDeployed) { string querystring = ApplicationDeployment.CurrentDeployment.ActivationUri.Query;
if (querystring == string.Empty) { return MemberInfoTable; }
int index = querystring.IndexOf("?"); if (index > -1) { querystring = querystring.Remove(index, 1); } querystring = HttpUtility.UrlDecode(querystring);
string[] MemberInfoPair = querystring.Split('&');
if (MemberInfoPair != null && MemberInfoPair.Length > 0) { foreach (string pair in MemberInfoPair) { string[] vars = pair.Split('='); if (!MemberInfoTable.ContainsKey(vars[0])) { MemberInfoTable.Add(vars[0],vars[1]); } } } } } catch (Exception) {
} return MemberInfoTable; } } |
ApplicationDeployment.IsNetworkDeployed : ClickOnce 응용프로그램인지 아닌지 여부 값을 가져옴
ApplicationDeployment.CurrentDeployment.ActivationUri.Query : 배포 메니페스트 Url 가지고옴
그 아래의 코드는 Uri에서 ? 제거, & 앞 뒤 나누고 ‘=’ 뒤의 스트링 문자값(파라미터)을 얻는 메서드이다.
|
public Form1(string mid, string mpw) { InitializeComponent();
OutputID.Text = mid; OutputPW.Text = mpw; } |
폼 생성자를 수정해주고, 전달 받은 파라미터 값들을 label에 넣어준다.
|
|
게시 옵션 버튼을 클릭하면 게시 옵션이라는 대화상자가 열리게 되는데 여기서 매니페스트에 있는
‘응용 프로그램으로 URL 매개 변수가 전달되도록 허용’에 꼭 체크를 해준다. |
|
Web에서 파라미터 전달 |
|
protected void Click_Click(object sender, EventArgs e) { string id = InputID.Text; string pw = InputPW.Text; Response.Redirect(string.Format("http://192.168.34.51/ClickOnceParamWin/ClickOnceParamWin.application?memID={0}&memPW={1}", id, pw)); } |
Response.Redirect(…) 메서드를 사용해서 ClickOnce 배포한 응용프로그램으로 응답할 수 있다.
|
실행결과 |
|
|