回答編集履歴

1 語句修正

dodox86

dodox86 score 6080

2017/09/29 13:42  投稿

こんにちは。
結論からですと、ファイルの拡張子に関連付けたファイルを起動した時に、
ClickOnceでは以下にファイル名が入っています。
```
AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]
```
[stack overflow: How to get command line from a ClickOnce application?](https://stackoverflow.com/questions/4607632/how-to-get-command-line-from-a-clickonce-application)
以下は、既にご存知かもしれませんが、参考の為に
[ClickOnce アプリケーションのファイルの関連付けを作成する](https://msdn.microsoft.com/ja-jp/library/bb892924.aspx)
確認の為にテストプロを作りました。拡張子"tx4"に関連付けて、*.tx4なファイルを
動作の確認の為にテストプロを作りました。拡張子"tx4"に関連付けて、*.tx4なファイルを
ダブルクリックしたときに引数を出力するClickOnce対応のコンソールプログラムです。
AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
は関連付けでの起動では無い場合にはnullになっているので、適時、スキップする必要があります。
コードを示します。下の方はSystem.Environment.GetCommandLineArgs()等との
比較の為に書いただけですので気にしないでください。
Visual Studio 2017 Professionalで作成し、Windows 7 64ビット版で確認しています。
```C#
using System;
namespace ClickOnceTest01
{
   class Program
   {
       static void Main(string[] args)
       {
           Console.WriteLine("Main.START");
           Console.ReadKey();
           if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments != null)
           {
               // ClickOnceでの起動の場合
               var data = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData;
               if (data != null)
               {
                   // ファイル名は AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]
                   // に入っている。
                   Console.WriteLine("ClickOnce: " + data[0]);
                   // 確認の為、全要素を出力
                   for (int i = 0; i < data.Length; i++)
                   {
                       string msg = string.Format("ClickOnce data#{0}={1}", i, data[i]);
                       Console.WriteLine(msg);
                   }
               }
           }
           // 普通に Main.args[]
           if (args != null)
           {
               for (int i = 0; i < args.Length; i++)
               {
                   Console.WriteLine("Main.args: " + args[i]);
               }
           }
           // Environment.GetCommandLineArgs
           var args2 = System.Environment.GetCommandLineArgs();
           for (int i = 0; i < args2.Length; i++)
           {
               Console.WriteLine("GetCommandLineArgs:" + args2[i]);
           }
           Console.WriteLine("Main.END");
           Console.ReadKey();
       }
   }
}
```
関連付けは、ClickOnceの設定画面で行っています。
![イメージ説明](7c3d14b81c78c020f54cdbae83652679.png)
C:\project\test\ClickOnceTest01\publish\testdata.tx4 をダブルクリックしたとき
の実行結果です。"Main.START"の次の行で、引数のファイル名を出力しています。
![イメージ説明](5d305510f702365f3dc8e79a8bfd806a.png)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る