C#を使っていると、たまに別のアプリを起動したくなることがあります。
例えば、画像処理ツールのImageMagickをプログラムで実行したいときなどですね。
実行環境
今回、実行環境はdotnet core2.0を使っていますが、もちろん.Net Frameworkでも問題ないと思います。
試してはいないですけど。
あ、実行OSはWindows10です。
最も簡単な実行方法
System.Diagnostics名前空間のProcess#Startメソッドを使えば簡単に実行できます。
よくあるサンプルとして、メモ帳を起動するコードが以下です。
using System;
using System.Diagnostics;
namespace ProcessStartSample
{
class Program
{
static void Main(string[] args)
{
Process.Start("notepad");
}
}
}
極めて簡単。
こいつを実行すると、音もなくすっとメモ帳が起動できます。
色々指定して起動したい場合
実行時引数であるとか、ウィンドウの表示・非表示であるとか、色々指定したいときには、
ProcessStartInfoインスタンスを使用します。
以下は、メモ帳を引数付きで実行するサンプルです。
using System;
using System.Diagnostics;
namespace ProcessStartSample
{
class Program
{
static void Main(string[] args)
{
var app = new ProcessStartInfo();
app.FileName = "notepad";
app.Arguments = "memo.txt";
Process.Start(app);
}
}
}
Win32Exceptionが発生して実行できない!
正直今回の記事の本題はこれ。
ほーん。こんなに簡単に起動できるのか!便利やん!と思って、メモ帳以外のアプリを起動しようと思ったら、このWin32Exceptionが発生して起動できない!ってことが発生しました。
現象
ここではVisual Studio Codeを起動してみることにしましょう。
まずはコマンドプロンプトでもパワーシェルでもいいので、起動できることと、アプリ名を確認します。
PS C:\User\yasu> code hello.cs
codeというコマンド名で実行するとVisual Studio Codeが起動することは確認しました。
あとはメモ帳と同じようにファイル名にcodeを指定すればよさそうです。
using System;
using System.Diagnostics;
namespace ProcessStartSample
{
class Program
{
static void Main(string[] args)
{
Process.Start("code");
}
}
}
しかし、上記を実行するとWin32Exceptionが発生して起動できません。
同様に、結構なアプリで起動ができないです。
しかも、公式のも含め、みんなメモ帳を起動するサンプルコードしかないのでにっちもさっちもいきません。
解決方法
UseShellExecuteをtrueにしてシェルから起動するように指定してあげればいいみたいです。
using System;
using System.Diagnostics;
namespace ProcessStartSample
{
class Program
{
static void Main(string[] args)
{
var app = new ProcessStartInfo();
app.FileName = "code";
app.UseShellExecute = true;
Process.Start(app);
}
}
}
メモ帳もこれでも起動できたので、基本この指定方法でいいんじゃないかなぁと。