#概要
.NET 5.0環境において、ブラウザアプリケーションから任意のURLを開く方法は以下の通り。
var startInfo = new System.Diagnostics.ProcessStartInfo("https://google.com/");
startInfo.UseShellExecute = true;
System.Diagnostics.Process.Start(startInfo);
もしくは
System.Diagnostics.Process.Start(@"C:\Program Files\Google\Chrome\Application\chrome.exe", "https://google.com/");
// 第1引数にブラウザのアプリケーションの絶対パス、第2引数にURL
#以下、時間のある方向け
曖昧な箇所あり。ご了承お願い致します。
##遭遇した事象
以下のコードで、windowsコンソールアプリからブラウザを開くことができなかった。
System.Diagnostics.Process.Start("https://google.com/");
遭遇したエラーはWin32Exception
ちなみに環境は以下の通り
・Windows10 Home
・Visual Studio Community 2019
・.NET 5.0
##エラー理由
.NET Core 2.1以降、つまり.NET Core 3.1や、.NET 5.0において、StartInfo.UseShellExecute
の既定値の変更が行われていることが原因。.NET Framework(少なくとも4.7.2)では規定値がtrue
だが、.NET 5.0や.NET Core 2.1以降ではfalse
となっている。
StartInfo.UseShellExecute
について
・trueの場合
システムにインストールされているアプリケーションに関連付けられている拡張子のファイルであれば、
ファイル名を指定するだけでアプリケーションを起動できる。
例:引数にhoge.txt
を指定 → メモ帳アプリで指定したtxtファイルを開く
・falseの場合
実行可能形式であるファイル名を指定し、プロセスを作成する。
※URLは実行可能形式ではないため、ここでエラーが発生する。
##解決策
StartInfo.UseShellExecute
プロパティを自分でtrue
に設定する。
var startInfo = new System.Diagnostics.ProcessStartInfo("https://google.com/");
startInfo.UseShellExecute = true;
System.Diagnostics.Process.Start(startInfo);
もしくは
System.Diagnostics.Process.Start(@"C:\Program Files\Google\Chrome\Application\chrome.exe", "https://google.com/");
// 第1引数にブラウザのアプリケーションの絶対パス、第2引数にURL
場合によっては、前者を共通関数みたいにしてしまうのがいいかなぁと、素人なりに思った。
対象環境
.NET 5.0 以降
.NET Core 2.1, 3.1 以降
##参考文献
https://uchukamen.com/Programming1/Process/