Microsoft Visual Studio 2017 Installer で インストール後にアプリケーションを起動したい

インストール後、すぐにアプリケーションを起動するようにしたい。
インストールフォルダに移動してEXEファイルを実行、ショートカットを実行するのが面倒。

前提条件

インストーラークラス を作成

Windows フォームアプリケーション のプロジェクトに インストーラークラス(Installer.cs)を作成する。
アプリケーションの起動は、インストール後の処理なので、Commitメソッドをオーバーライドして、新たなプロセスを開始するように処理を記述する。
AssemblyPath を指定して取得できるパラメーターは、アプリケーションのインストール先のパスになっている。
例)C:\Program Files (x86)\Default Company Name\Setup1\WindowsFormsApp1.exe

using System.Collections;
using System.ComponentModel;
using System.Diagnostics;

namespace  WindowsFormsApp1
{
    [RunInstaller(true)]
    public partial class Installer : System.Configuration.Install.Installer
    {
        public Installer()
        {
            InitializeComponent();
        }

        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            Process.Start(this.Context.Parameters["AssemblyPath"]);
        }
    }
}

カスタム動作で指定をする

Visual Studio Installer プロジェクトの ファイルシステム > Application Folder に、プライマリ出力で Windows フォームアプリケーション を追加する。
その後、カスタム動作にて、プライマリ出力 Windows フォームアプリケーション(WindowsFormsApp1)を追加する。
Commitメソッドしかオーバーライドしていないが、全てに対して指定を行わないと、うまく動作しなかった。
f:id:kameya_takefumi:20180906152451p:plain
設定完了。
Windows フォームアプリケーション をビルド後に Visual Studio Installer プロジェクト をビルドして、インストールして動作を確認する。

余談

情報を探していると、Visual Studio Installer プロジェクトのカスタム動作で CustomActionData に [TARGETDIR] を指定し、インストーラークラス で、その値を取得して処理を行うパターンが見受けられた。
このやり方はナンセンスすぎるように思える。

Visual Studio Installer プロジェクト で指定されるカスタム値を、別プロジェクトのインストーラークラスが、それをある前提で値を受け取り処理をするのは、依存度が高くて危険すぎる。
結局、その値をゴチャゴチャやって、this.Context.Parameters["AssemblyPath"] で取れる値と同じものを作成していたりする。
動けばいいんですけど、私は許容できないなぁ。

戦争にチャンスを与えよ

非常に面白かった。

本のタイトルは過激ですね。
内容は非常に現実的な内容でした。

読み終わって思うのは「平和を望むなら、戦争を知る必要がある」でした。
この本にも「平和を望むなら戦に備えよ」という格言が書かれていました。

日本で戦争となると、個人の悲惨な体験などに焦点がいきがちですが、広い視野で戦争とは何かを知る必要がありますね。

平和と戦争って表裏一体だという事に気づきました。
戦争の始まりは平和の終わりを意味し、戦争の終わりは平和の始まりを意味するからです。

戦争の始まりを知れば、平和を長く続ける具体的な行動が取れますし、戦争の終わりを知れば、いかにして戦争を終わらせて、平和な世にするのか具体的な行動が取れます。
「まぁ大丈夫だろう」ではなく、知る必要があります。


読んでいて疑問に思える部分もありました。
たびたび降伏すれば平和が訪れる的な発言がありました。

ですが、国にとって譲れない部分があり、日本だと天皇など国体に大きく関わる部分です。
降伏する事で、それらが大きく損なわれる事になれば、その後の平和、復興にどれだけの影響があるのか、わかりません。

著者は俯瞰して物事を見ているので、降伏すれば、生命という1つの単位がより残るよ、ぐらいで考えて発言していそうです。
それまで現実的な理論で語っていたのに、急に投げっぱなしというか雑な意見に思えました。
ここらへんは、考え方の根底に何があるのか知らないと、わかりようがないですが。


戦略の重要性については、戦国武将を上げて説明していて非常にわかりやすく親近感がわきます。
大きな戦略の前には、1つの戦術的勝利なんて意味がないのは、悲しいけど真理ですね。

逆説的理論(パラドキシカル・ロジック) という概念は凄いですね。
戦略は相手がいる事を前提とし、理論が適用される点を意識する事が重要ですね。
とてもできそうにないですが。

色々と示唆が多く、疑問もあり、読んでおいた方がいい一冊です。

Microsoft Visual Studio 2017 Installer Projects で スタートアップ に EXEファイル を設定する

インストーラーにて配布する exeファイル をスタートアップに設定して、ログオン時に自動起動するようにしたい。

前提条件

ファイルシステムを表示

f:id:kameya_takefumi:20180816104733p:plain

ファイルを追加

  • File System(Setup1) → Application Folder → 右クリック → Add → ファイル を選択

f:id:kameya_takefumi:20180816105000p:plain

  • 選択した exeファイル が追加される事を確認

f:id:kameya_takefumi:20180816105155p:plain

レジストリを表示

f:id:kameya_takefumi:20180816105341p:plain

キーを追加

  • キーの追加で HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run までのパスを作成

f:id:kameya_takefumi:20180816105655p:plain

文字列の値を追加

  • Name : test, Value : [TARGETDIR]WindowsFormsApp1.exe

f:id:kameya_takefumi:20180816110055p:plain

ソリューションのビルド

  • ビルド → ソリューションのビルド

インストールを行いレジストリの値を確認

  • レジストリエディターで HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run に EXEファイルまでのパス が設定されている事を確認

f:id:kameya_takefumi:20180816111018p:plain

マシンを再起動しログオン

Microsoft Visual Studio 2017 Installer Projects で すべてのユーザー/このユーザーのみ の選択肢を非表示にする

すべてのユーザー/このユーザーのみ の選択肢が不要なため非表示する。

f:id:kameya_takefumi:20180815115351p:plain

前提条件

ユーザーインターフェイスを表示

f:id:kameya_takefumi:20180815115905p:plain

インストールフォルダーを選択

  • User Interface(Setup1) → インストールフォルダー を選択

f:id:kameya_takefumi:20180815130809p:plain

InstallAllUsersVisible を Flase に変更

  • プロパティ → InstallAllUsersVisible を Flase に変更

f:id:kameya_takefumi:20180815131021p:plain

ソリューションのビルド

  • ビルド → ソリューションのビルド

インストーラーを実行

  • 選択肢が非表示な事を確認

f:id:kameya_takefumi:20180815131423p:plain

余談

InstallAllUsersVisible というプロパティ名から、デフォルトでは このユーザーのみ が正のようです。

ソリューション エクスプローラー → Setup1 → プロパティ → InstallAllUsers というプロパティ項目があります。
デフォルト値は Flase で True に変更すると、インストール時に すべてのユーザー にチェックが入ります。
この値を変更しても、インストールフォルダーのパスに変更はありません。

ここだけの挙動を見ていると、すべてのユーザー/このユーザーのみ の選択は、ガワだけって事なんですかね。
選択によって処理を切り分けできる実装をする前提なんでしょうか。
もしかしたら、ショートカットの配置場所を、よしなにやってくれるのでしょうか。

正式なドキュメントを読まないとダメそうです。

日本人のための軍事学

日本人のための軍事学 (角川新書)

日本人のための軍事学 (角川新書)

非常に面白かった。
いいタイミングで、この本が出てくれました。

安全保障や自衛隊について、優しく教えてくれるので、助かります。
前半部分は「軍事学」の基本となる話で、後半部分はアジアの今後についての話で構成されています。

以下、引用しつつ自分のために、まとめる。

安全保障とは、端的に言うと国家・国民が有する「防衛力」の総力のことで、軍事力ばかりでなく、外交力や経済力、そして情報力や技術力なども含まれます。

安全保障を強化する事は、軍事力を強化する事だと思っていましたが、上記を読むと「国力」とも読めますね。
今までは、安全保障については軍事という分野に丸投げしていけば良いという考えでしたが、それは間違いですね。
国民一人一人が国として安全保障を考え、自身の分野で何ができるのかを問う所までいけるといいですね。

  • 武力とは?
    • 国際関係において、国民を守るための軍事的な力が、 武力だと思います。
    • 安全保障の一部としての軍事力と、武力行使の手段としての軍事力がある。
    • 他国からの武力行使に対抗し、軍事的脅威を抑止できるのは、基本的に自国の軍事力であるということ。

軍事に対抗するのは軍事ですね。
これは替えがきかない。
武装はありえないですね。

  • 戦争の目的は自分の意志を相手に強要すること
  • 国際法上、戦争は、最後に外交交渉で平和条約を結んで終結します。

今「戦争にチャンスを与えよ」を読んでいますが、この部分は面白い。
現在、紛争が起きると、外部干渉で停戦、休戦状態になり、平和条約を結ぶに至っていない事が多いみたいです。
朝鮮半島を見ていると、終結はかなり難しそうです。

  • 領土に市民がいて外国の軍隊が攻めてきたときに、占領軍がまだ到着していない時点では、市民は義勇軍をつくって武力で抵抗してもいい。
  • すでに外国の軍隊が到着し、軍政を敷くなり、その地域を制圧してしまった場合、市民は武力で抵抗してはいけない。

ハーグ陸戦法規 第一款 交戦者 第一章 交戦者の資格 第2条 に該当するのかな。
沖縄であれば、対中を考えると知っておいた方がいいですね。

ここは非常に面白い。
一貫性がないのは、どうなんだろうと思いつつも、こうせざる得ない気もしますね。
日本とって今後の課題でしょうね。

戦争には「出口論」が必要

これは色んな所で言われていますね。
日本人の場合、結論を出さないというか、戦略上、切り捨てる判断をしたがらないので、出口論に行き着かない感じしますね。
上位層が責任を取りたくないという甘えもありそうですが。

  • 軍事同盟
    • (一) 防衛条約
    • (二) 攻撃条約(第二次世界大戦後の国際法では違法)
    • (三) 不可侵条約
    • (四) 中立条約
    • (五) 協議条約

軍事同盟に種類があるのを初めて知りました。
戦争を抑止する効果もあるが、戦争が始まってしまうと拡大する効果もあり、メリット・デメリットがあって面白いですね。