配布方法に依らないコマンドライン引数の取得
.NET WindowsFormsアプリケーションでコマンドライン引数を取得するには、エントリポイントのMain関数で取得する他に、以下の方法がある。
string[] args = Environment.GetCommandLineArgs();
しかし、これは通常のアプリケーションの話であってClickOnceで配布されたアプリケーションは、そう簡単にはいかない。ClickOnceアプリケーションはClickOnceローダ(dfsvc.exe)又はAppLaunch.exeにホストされたアセンブリとしてURLからロードされるので、コマンドライン引数を渡すことはできない。ならば起動時にパラメタを渡すことはできないのか、思えばそうに非ず。
ClickOnceアプリケーションは、発行時にオプションのパラメタとして「URLパラメタをアプリケーションに渡す」という指定ができるのである。
この指定を行うと、配布マニフェストの
このように設定されたマニフェストで構成された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()) 〜 }
等とすれば、配布方法に依らずアプリケーションに渡されたパラメタを取得できるだろう。