配布方法に依らないコマンドライン引数の取得

.NET WindowsFormsアプリケーションでコマンドライン引数を取得するには、エントリポイントのMain関数で取得する他に、以下の方法がある。

string[] args = Environment.GetCommandLineArgs();

しかし、これは通常のアプリケーションの話であってClickOnceで配布されたアプリケーションは、そう簡単にはいかない。ClickOnceアプリケーションはClickOnceローダ(dfsvc.exe)又はAppLaunch.exeにホストされたアセンブリとしてURLからロードされるので、コマンドライン引数を渡すことはできない。ならば起動時にパラメタを渡すことはできないのか、思えばそうに非ず。
ClickOnceアプリケーションは、発行時にオプションのパラメタとして「URLパラメタをアプリケーションに渡す」という指定ができるのである。

この指定を行うと、配布マニフェスト要素におけるtrustedparameters属性がtrueとセットされる。


このように設定されたマニフェストで構成されたClickOnceアプリケーションは以下方法でURLとそのQUERYパラメタにアクセスできるようになる。例えば以下のようなURL

http://hostname/ClickoneceApp.Application?username=kazzz

を設定して起動されたClickOnceアプリケーションは

string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
string queryString = (new Uri(url)).Query;

とクエリパラメタ"username=kazzz"を取得できるので、通常のアプリケーションのコマンドライン引数と同様に使うことができる。
一方、アプリケーション側は自分が通常のアプリケーションとして起動されたのか、それともClicOnceアプリケーションとして起動されたのかは判らないので、以前も使ったApplicationDeploymentクラスを使って

if (ApplicationDeployment.IsNetworkDeployed)
{
    // ClickOnce application
    string url = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
    string queryString = (new Uri(url)).Query;
    〜
}
else
{
    // normal application
    string[] args = Environment.GetCommandLineArgs())
    〜
}

等とすれば、配布方法に依らずアプリケーションに渡されたパラメタを取得できるだろう。