연습: ClickOnce 배포 API를 통해 주문형 어셈블리 다운로드
기본적으로 ClickOnce 애플리케이션에 포함된 모든 어셈블리는 애플리케이션을 처음 실행할 때 다운로드됩니다. 그러나 소수의 사용자가 사용하는 일부 애플리케이션이 있을 수 있습니다. 이 경우 해당 형식 중 하나를 만들 때에만 어셈블리를 다운로드하고자 할 수 있습니다. 다음 연습에서는 애플리케이션의 특정 어셈블리를 "선택 사항"으로 표시하는 방법 및 CLR(공용 언어 런타임)에서 요청할 때 System.Deployment.Application 네임스페이스에 있는 클래스를 사용하여 이를 다운로드하는 방법을 설명합니다.
참고
이 절차를 사용하려면 완전 신뢰 상태에서 애플리케이션을 실행해야 합니다.
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소 중 하나가 필요합니다.
- Windows SDK. Windows SDK는 Microsoft 다운로드 센터에서 다운로드할 수 있습니다.
- Visual Studio.
프로젝트 만들기
주문형 어셈블리를 사용하는 프로젝트를 만들려면
- ClickOnceOnDemand라는 디렉터리를 만듭니다.
- Windows SDK 명령 프롬프트 또는 Visual Studio 명령 프롬프트를 엽니다.
- ClickOnceOnDemand 디렉터리로 변경합니다.
- 다음 명령을 사용하여 퍼블릭/프라이빗 키 쌍을 생성합니다.
sn -k TestKey.snk
- cmd복사
- 메모장 또는 다른 텍스트 편집기를 사용하여 Message라는 단일 속성을 사용하여 DynamicClass라는 클래스를 정의합니다.
using System; using System.Collections.Generic; using System.Text; namespace Microsoft.Samples.ClickOnceOnDemand { public class DynamicClass { public DynamicClass() {} public string Message { get { return ("Hello, world!"); } } } }
- C#복사
- 사용하는 언어에 따라 ClickOnceLibrary.cs 또는 ClickOnceLibrary.vb 라는 파일로 텍스트를 ClickOnceOnDemand 디렉터리에 저장합니다.
- 파일을 어셈블리로 컴파일합니다.
csc /target:library /keyfile:TestKey.snk ClickOnceLibrary.cs
- C#복사
- 어셈블리를 위한 퍼블릭 키 토큰을 얻으려면 다음 명령을 사용합니다.
sn -T ClickOnceLibrary.dll
- cmd복사
- 텍스트 편집기를 사용하여 새 파일을 만들고 다음 코드를 입력합니다. 이 코드는 필요한 경우 ClickOnceLibrary 어셈블리를 다운로드하는 Windows Forms 애플리케이션을 만듭니다.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; using System.Deployment.Application; using Microsoft.Samples.ClickOnceOnDemand; namespace ClickOnceOnDemand { [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Unrestricted=true)] public class Form1 : Form { // Maintain a dictionary mapping DLL names to download file groups. This is trivial for this sample, // but will be important in real-world applications where a feature is spread across multiple DLLs, // and you want to download all DLLs for that feature in one shot. Dictionary<String, String> DllMapping = new Dictionary<String, String>(); public static void Main() { Form1 NewForm = new Form1(); Application.Run(NewForm); } public Form1() { // Configure form. this.Size = new Size(500, 200); Button getAssemblyButton = new Button(); getAssemblyButton.Size = new Size(130, getAssemblyButton.Size.Height); getAssemblyButton.Text = "Test Assembly"; getAssemblyButton.Location = new Point(50, 50); this.Controls.Add(getAssemblyButton); getAssemblyButton.Click += new EventHandler(getAssemblyButton_Click); DllMapping["ClickOnceLibrary"] = "ClickOnceLibrary"; AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); } /* * Use ClickOnce APIs to download the assembly on demand. */ private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { Assembly newAssembly = null; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment; // Get the DLL name from the Name argument. string[] nameParts = args.Name.Split(','); string dllName = nameParts[0]; string downloadGroupName = DllMapping[dllName]; try { deploy.DownloadFileGroup(downloadGroupName); } catch (DeploymentException de) { MessageBox.Show("Downloading file group failed. Group name: " + downloadGroupName + "; DLL name: " + args.Name); throw (de); } // Load the assembly. // Assembly.Load() doesn't work here, as the previous failure to load the assembly // is cached by the CLR. LoadFrom() is not recommended. Use LoadFile() instead. try { newAssembly = Assembly.LoadFile(Application.StartupPath + @"\" + dllName + ".dll," + "Version=1.0.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33"); } catch (Exception e) { throw (e); } } else { //Major error - not running under ClickOnce, but missing assembly. Don't know how to recover. throw (new Exception("Cannot load assemblies dynamically - application is not deployed using ClickOnce.")); } return (newAssembly); } private void getAssemblyButton_Click(object sender, EventArgs e) { DynamicClass dc = new DynamicClass(); MessageBox.Show("Message: " + dc.Message); } } }
- C#복사
- 코드에서 LoadFile에 대한 호출을 찾습니다.
- PublicKeyToken을 이전에 검색한 값으로 설정합니다.
- 파일을 Form1.cs 또는 Form1.vb 로 저장합니다.
- 다음 명령을 사용하여 실행 파일로 컴파일합니다.
csc /target:exe /reference:ClickOnceLibrary.dll Form1.cs
- C#복사
어셈블리를 선택 사항으로 표시
MageUI.exe를 사용하여 ClickOnce 애플리케이션에서 어셈블리를 선택 사항으로 표시하려면
- MageUI.exe 를 사용하여 연습: ClickOnce 애플리케이션 수동으로 배포에 설명된 대로 애플리케이션 매니페스트를 만듭니다. 애플리케이션 매니페스트에 대해 다음 설정을 사용합니다.
- 애플리케이션 매니페스트의 이름을 ClickOnceOnDemand 로 지정합니다.
- 파일 페이지의 ClickOnceLibrary.dll 행에서 파일 형식 열을 없음 으로 설정합니다.
- 파일 페이지의 ClickOnceLibrary.dll 행에서 Group 열에 ClickOnceLibrary.dll을 입력합니다.
- MageUI.exe 를 사용하여 연습: ClickOnce 애플리케이션 수동으로 배포에 설명된 대로 배포 매니페스트를 만듭니다. 배포 매니페스트에 대해 다음 설정을 사용합니다.
- 배포 매니페스트의 이름을 ClickOnceOnDemand로 지정합니다.
새 어셈블리 테스트
요청 시 어셈블리를 테스트하려면
- 웹 서버에 ClickOnce 배포를 업로드합니다.
- 배포 매니페스트에 URL을 입력하여 웹 브라우저에서 ClickOnce로 배포된 애플리케이션을 시작합니다. ClickOnceClickOnceOnDemand 애플리케이션을 호출하고 adatum.com 루트 디렉터리에 업로드하면 URL은 다음과 같습니다.
http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application
- 복사
- 기본 폼이 나타나면 Button을 누릅니다. 메시지 상자 창에 "Hello, World!"라는 문자열이 표시되어야 합니다.
참조
권장 콘텐츠
-
ClickOnce 애플리케이션 - Visual Studio (Windows)
게시 마법사를 사용하여 처음으로 ClickOnce 애플리케이션을 게시하는 방법을 알아봅니다. Project 디자이너의 게시 페이지에서 나중에 변경합니다.
-
ClickOnce 앱 수동 배포 - Visual Studio (Windows)
명령줄 버전 또는 매니페스트 생성 및 편집 도구의 그래픽 버전 중 하나를 사용 하 여 ClickOnce 배포를 만드는 방법에 대해 알아봅니다.
-
로컬 & 원격 데이터 액세스(ClickOnce 앱) - Visual Studio (Windows)
로컬 및 원격으로 데이터를 읽고 쓰기 위해 ClickOnce 제공하는 다양한 옵션에 대해 알아봅니다.
-
ClickOnce 및 응용 프로그램 설정 - Visual Studio (Windows)
응용 프로그램 설정 파일이 ClickOnce 응용 프로그램에서 작동 하는 방법 및 사용자가 다음 버전으로 업그레이드 하는 경우 설정 ClickOnce 마이그레이션하는 방법에 대해 알아봅니다.
-
ClickOnce 업데이트 전략 선택 - Visual Studio (Windows)
ClickOnce 애플리케이션에서 자동 업데이트를 지원하는 방법과 사용할 수 있는 업데이트 전략을 알아봅니다.
-
ClickOnce 응용 프로그램에 대 한 코드 액세스 보안 - Visual Studio (Windows)
ClickOnce 응용 프로그램에 대 한 코드 액세스 보안 및 코드 액세스 보안 권한을 구성 하는 방법에 대해 알아봅니다.
-
ClickOnce 애플리케이션 보안 - Visual Studio (Windows)
ClickOnce 응용 프로그램에 대 한 코드에 대 한 액세스를 제한할 수 있는 .NET Framework의 코드 액세스 보안 제약 조건에 대 한 영향에 대해 알아봅니다.
-
ApplicationDeployment 클래스 (System.Deployment.Application)
현재 배포를 프로그래밍 방식으로 업데이트하도록 지원하고 요청 시에 파일을 다운로드하도록 처리합니다.Supports updates of the current deployment programmatically, and handles on-demand downloading of files. 이 클래스는 상속될 수 없습니다.This class cannot be inherited.
'Language > C#(CLR,.NET)' 카테고리의 다른 글
[C#/Version] ClickOnce 또는 Assemply 현재 버전(Current Version) 확인 (0) | 2021.10.01 |
---|---|
[C#/JSON] JSON 파일 쓰기/일기 (Write/Read) - using Newtonsoft.Json (0) | 2021.10.01 |
[C#/Event] TextBox 등 Control 객체의 키보드 이벤트 샘플(KeyPress, KeyDown) (0) | 2021.10.01 |
[C#] 어셈블리 EnvDTE, EnvDTE80 간접 참조 경고 발생시 (0) | 2013.04.04 |
[C#]Window Form에 적용할 DevExpress Skin 관련 소스 (0) | 2013.04.03 |