Search
Duplicate

.NET/ MS Visual Studio Installer 설정 및 driver 설치

.NET 프로젝트의 인스톨 버전을 만들어야 하는 일이 가끔 있어서 정리. .NET을 사용하면 MS Visual Studio Installer를 사용하면 쉽게 만들 수 있으므로 그것을 이용한다.
기본적으로 MS Visual Studio Installer는 이미 존재하는 프로젝트에 대해 msi 형식의 설치 파일을 만들어주므로 우선 프로젝트 자체가 있어야 한다. 이하에서는 WPF 프로젝트를 이용했지만, Winform도 가능하다.

MS Visual Studio Installer Project 설치 및 프로젝트 생성

Visual Studio 상단 메뉴에서 확장 → 확장 관리를 하면 아래와 같은 다이얼로그가 뜨고, 여기서 microsoft visual studio라고 치면 상단에 Microsoft Visual Studio Installer Projects가 뜬다. 이것을 설치한다.
설치를 마쳤으면 새 프로젝트에서 setup이라고 치면 나오는 Setup Project를 선택해서 프로젝트를 생성한다. WPF 프로젝트와 이름을 맞춰서 설정했음
설치 파일을 만들 프로젝트 (TestSetup.WPF)와 그것의 Setup 프로젝트가 만들어졌다.

프로젝트 추가

1.
우선 설치 파일로 만들 프로젝트를 추가한다. 왼쪽 화면의 Application Folder를 선택한 후에 우클릭 해서 나오는 메뉴에서 Add → 프로젝트 출력을 선택한다.
이 Application Folder가 설치와 관련된 대부분의 파일이 존재하는 곳이라 할 수 있다. 향후 icon이나 driver 등 필요한 모든 파일은 다 이곳에 두면 된다.
User’s Desktop과 User’s Programs는 각각 바탕화면과 프로그램 메뉴에 존재하는 파일에 해당한다.
2.
프로젝트 출력에서 설치 파일을 만들 프로젝트를 선택하고, 상단의 게시 항목을 선택하면, 해당 프로젝트를 빌드 했을 때 나오는 항목들이 자동으로 포함된다.
3.
게시 항목이 나오면 완료. 이 상태에서도 Setup 프로젝트를 선택해서 빌드(재빌드)를 하면 .msi 파일이 만들어지고 그걸 실행하면 설치가 된다.

Icon 추가

1.
프로젝트 설치 후에 바탕화면과 시작 메뉴에 뜰 아이콘을 추가한다. 우선 Application Folder에 프로그램 아이콘으로 쓸 이미지 파일을 추가한다.
2.
다음으로 프로젝트 게시 항목에 우클릭하여 ‘Create Shortcut to…’ 를 선택하면 게시 항목에 연결되는 바로가기가 만들어진다.
2.
원하는 이름으로 바꾼 후에 왼쪽의 User’s Desktop으로 옮긴다. 여기에 있으면 설치 후 사용자 컴퓨터의 바탕 화면에 뜬다.
3.
프로그램 메뉴에도 추가하기 위해 1번과 마찬가지로 게시 항목을 우클릭해서 Shorutcut을 만들고 이번에는 왼쪽의 User’s Programs Menu로 옮긴다. 여기에 있으면 시작 메뉴에 나온다.
4.
User’s Desktop에 들어가서 오른쪽의 속성 부분에서 AlwaysCreate를 True로 만든다. 이래야 바탕화면에 바로가기가 추가된다. 추가하고 싶지 않으면 False로 하면 된다.
5.
좀 전에 아까 옮겨 놨던 Shortcut 파일을 선택하고 오른쪽의 속성 메뉴에서 Icon을 선택하고 Browse를 선택하면 아래와 같이 아이콘을 찾을 수 있는 다이얼로그가 뜬다.
6.
다이얼로그에서 Browse를 선택한 후에 나오는 화면에서 Application folder를 선택하고, 그 안에 포함된 icon 파일을 선택한다.
7.
선택 후 Icon 속성에서 (Icon)이라 표시되면 완료. User’s Program Menu에 존재하는 Shortcut에도 같은 작업을 반복하면 —Always Create를 True로 만들고 icon 연결— Icon이 연결된다.

Font 추가

1.
만일 프로그램에서 별도로 사용하는 font 파일이 있다면 Application Folder에 넣으면 안되고, Target Machine을 우클릭해서 나오는 ‘Add Special Folder → 글꼴 폴더’를 선택해서 넣어야 한다. 이러면 프로그램 설치시 자동으로 글꼴이 해당 PC에 설치된다.
2.
폴더 생성 후 필요한 파일을 넣어둔다.

Driver 설치

만일 프로그램 설치시에 같이 설치해줘야 할 driver가 있다면 별도의 방법을 사용해야 한다. 여러 방법이 있지만, 여기서는 가장 단순한 방법을 사용하는데, 이걸 위해서는 독립된 Console Project가 필요하다.
이 Console Project에서 window의 PnPutil.exe 을 이용해서 드라이버 파일(.inf)을 설치한다. 다른 OS에서는 비슷한 방식으로 변형해서 사용할 것.
이것이 그나마 (개념적으로) 단순한 편이니 이것을 사용하는 것을 권장한다.
1.
우선 콘솔 프로젝트를 생성한다.
2.
생성된 콘솔 프로젝트에서 다음의 코드를 추가한다.
이 코드는 C#에서 PnPutil.exe 파일을 Process로 띄워서 argument로 들어오는 driver의 파일을 설치하는 코드이다.
Install에 driver를 설치하고, Uninstall에 driver를 삭제하기 위해 Install과 Uninstall 정보를 받아와서 처리해 준다. 이것을 어떻게 하는지는 이후에 설명.
사실 설치한 driver를 다른 프로그램에서 사용할 수 있으므로 삭제시 driver를 삭제하는 것은 권장하지 않는다.
using System.Diagnostics; if (args.Length > 1) { string action = args[0].Replace("/", ""); string value = action.Equals("install", StringComparison.InvariantCultureIgnoreCase) ? "a" : "d"; for (int i = 1; i < args.Length; i++) { string path = args[i]; string command = $@"/c C:\Windows\System32\PnPutil.exe -{value} {path}"; try { using (Process process = new Process()) { process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = command; // /c가 있어야 cmd가 PnPutil.exe를 실행한 후 종료함. process.Start(); process.WaitForExit(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
C#
복사
3.
위의 코드로 작성된 프로그램을 Release 모드로 빌드하고 만들어진 실행 파일 —exe, dll, json 파일—을 Application Folder에 추가한다.
4.
설치할 Driver를 마찬가지로 Application Folder에 적절한 폴더를 만들고 추가한다. —여기서는 설치할 drive가 2개가 있다고 가정하여 testDriver1.inf, testDriver2.inf라는 더미 파일을 만들어서 추가 함.
5.
다음으로 Setup 프로젝트를 우클릭한 후 ‘View → 사용자 지정 작업’을 선택한다. 그러면 아래와 같이 Install, Commit, Rollback, Uninstall 폴더가 보인다.
6.
이름에서 유추 가능하지만, 각각의 폴더는 4 단계에서 실행할 작업을 지정해 줄 수 있다. 우선 Install에서 driver를 설치하기 위해 Install 폴더에 우클릭 후에 ‘사용자 지정 작업 추가’를 선택하고 나오는 화면에서 앞서 Icon을 선택했던 것처럼 앞서 만든 콘솔 프로젝트의 exe 파일을 지정해 준다.
이러면 install 단계에서 자동으로 해당 콘솔 exe 프로그램을 실행한다.
7.
실행 파일이 만들어지면 오른쪽의 속성 부분에 Argument라는 부분이 보이고 기본 값으로 /Install 이라는 텍스트가 있는 것이 보인다.
이것이 바로 이전에 Console 프로젝트를 만들 때 넣었던 코드에서 Install 부분을 확인하는 것이 된다.
8.
Argument 부분에 다음과 같이 추가한다.
코드를 보면 알 수 있겠지만, 맨 앞의 Install은 현재 Install 단계임을 알려주고 —따라서 driver는 추가된다. Unintall이었다면 driver는 삭제 된다.— 그 다음은 설치해야 할 driver 파일 목록이다. 이 parameter를 앞서 만든 Console 프로그램에 보내면, 그 안에서 해당 파일을 찾아 driver를 설치하게 된다.
[TARGETDIR]은 이름에서 유추 가능하지만 설치되는 경로를 의미한다. 이것은 Setup 프로젝트가 알고 있는 값이며 콘솔 프로그램에 전달된다.
각각의 파라미터는 "<path>"로 감싸야 안전하다. 기본적으로 파라미터는 띄어쓰기에 의해 구분되는데, 만일 폴더 경로에 띄어쓰기가 있다면 잘못 처리될 수 있기 때문이다.
/Install "[TARGETDIR]drivers\testDriver1.inf" "[TARGETDIR]drivers\testDriver2.inf"
C#
복사
9.
만일 Uninstall 단계에서 설치한 Driver를 지우고 싶다면 Install 때와 마찬가지로 Uninstall 폴더에 추가하면 된다.
Install 때와 동일하지만 맨 앞에 상태가 Uninstall 이라는 것을 알려준다. 이러면 위의 콘솔 프로그램은 driver를 제거한다.
다만 다른 프로그램에서 해당 driver를 사용할 수 있다면 함부로 지우지 않는 것이 좋다.
/Uninstall "[TARGETDIR]drivers\testDriver1.inf" "[TARGETDIR]drivers\testDriver2.inf"
C#
복사

Default 설치 경로 변경

처음 Setup 프로젝트를 생성하면 프로그램 설치시 기본 경로가 [ProgramFiles64Folder][Manufacturer]\\[ProductName] 로 되어 있다. 이것은 일반적으로 C:\Program Files\[Manufactor][ProductName]의 경로가 되는데, 만일 이것을 수정하고 싶다면 다음의 위치에서 수정할 수 있다.
Setup 프로젝트 우클릭 → View → Application Folder 선택 → 오른쪽 속성 메뉴에서 DefaultLocation 부분에 원하는 경로 설정

Prerequisites

프로그램을 설치할 컴퓨터에 .NET Runtime이 없는 경우, 해당 버전에 맞는 .NET Runtime을 설치하기 위해 Prerequisites를 설정할 수 있다.
설치 프로젝트를 우클릭 → 속성을 선택하면 아래와 같은 화면이 뜨는데 여기서 Prerequisites를 선택하면 프로그램 설치 전 필수 구성 요소를 설정할 수 있다.
필수 구성 요소가 설정된 Setup 프로젝트를 빌드하면 [ProgramName].msi 파일 외에 [ProgramName].exe도 생성되는데, msi 파일만 실행하면 프로그램 설치만 되고, exe 파일을 실행하면 현재 컴퓨터의 .NET Runtime을 확인해서 필수 구성 요소를 설치한 후에 msi 파일을 실행해서 프로그램을 설치할 수 있다.