2019年06月17日
川俣晶の縁側ソフトウェア技術雑記 total 4589 count

.NET Coreで関連付けられたアプリを起動できない【改訂版】

Written By: 川俣 晶連絡先

 かずきさんのご教示により、問題の詳細と対策が分かったので改訂版を作成しました。

問題 §

 .NET Coreで以下のコードが実行できない。

System.Diagnostics.Process.Start("c:\\delme\\delme1.txt");

原因 §

 ProcessStartInfo.UseShellExecute Propertyのドキュメントに"The default is true on .NET Framework apps and false on .NET Core apps."と明示されているように、プロセス起動処理設定の初期値が異なっている模様。.NET Frameworkと.NET Coreの明示された非互換性である。

解決 §

 ProcessStartInfo.UseShellExecute Propertyの初期値を明示的に指定する。たとえば以下のように指定する。

var startInfo = new System.Diagnostics.ProcessStartInfo("c:\\delme\\delme1.txt");

startInfo.UseShellExecute = true;

System.Diagnostics.Process.Start(startInfo);

 ただし、全てのプラットフォームに指定できるわけではない。たとえば、UWPで指定するとPlatformNotSupportedExceptionが発生することがドキュメントで明示されている。(もっとも、一般開発者には利用が許されない機能になるらしく、そもそも指定することすらできない模様)

 それ以前に、Linux、MacOS、Nano ServerではProcess.Start Methodそのものが動作せずPlatformNotSupportedExceptionになるケースがある。

 そのため、これは【こう書き換えれば必ず動く】という解決策ではない。

オマケ §

「.NET Frameworkと.NET Coreの非互換性は割といっぱいある。.NET CoreがWinFormやWPFをサポートしたと主張したって、実際にコンパイルすると足りない機能が山ほどあって簡単に既存のソース資産を移動できるようなものではなかったから、さくっと.NET Coreに夢を見るのをやめた」

「それと本件にどんな関連があるんだい?」

「うん、非互換性は主に【無い】という形で現れてきた。だから、設定初期値が違うという状況は盲点だった」

「なるほど。君が想定したより根深い問題があるわけだね」

「結局、一番タチが悪いのは同じ名前の機能はあるのに値が違うというケース。無いものは互換レイヤーを挟んで何とか互換を取る方法があるが、名前が同じだとトラブルが起きているのに原因がとても分かりにくくなる」

「こんな非互換性が平然とあって、.Frameworkと.NETCoreを統合して.NET 5が素直に成立するのか?」

「さあ。それをおいらに聞かれても分からない」