たとえば、関連するファイル拡張子を登録するClickOnceアプリケーションの開発と展開に成功しました*.abc。名前の付いたファイルをクリックするx.abcかx.abc、コマンドプロンプトから入力すると、ClickOnceアプリケーションが起動し、専用のAPIを介してファイルを取得できます。次のコードを使用して、プログラムでアプリケーションを起動することもできます。
System.Diagnostics.Process.Start ("x.abc");
私のWindowsVista64ビットボックスではすべて正常に動作します。
ただし、Windows 7(これも64ビット)でまったく同じことを実行しようとすると、非常に奇妙な問題が発生します。これが私が観察するものです:
x.abcエクスプローラーからダブルクリックして手動で起動することができます。x.abcコマンドプロンプトからの手動起動が機能します。Process.Start("x.abc")アプリケーションを起動しません。ただし、返されたプロセスオブジェクトは、エラーがなく、ClickOnceアプリケーションが何らかの理由ですぐに終了したことを示しています。ただしTrace、ClickOnceアプリケーションの最初の段階でさえ到達することはありません。- まだ見知らぬ人ですが、1行を含む
Process.Start("x.bat")ファイルでは、ClickOnceアプリケーションも起動しません。同じことがエクスプローラーの作品から始まりました(もちろん)。x.batx.abcx.bat
ProcMon私の観点からすると、アプリケーションを起動するClickOnceプロセスを追跡するのは非常に難しいため、何が起こっているのかを分析しようとしてもあまり役に立ちませんでした。私は仕事に取り掛かることを観察rundll32しますが、失敗の証拠はありません。
を実行しているプログラムProcess.Startは、まったく凝ったものがない完全な信頼コンソールアプリケーションです。
ClickOnceアプリケーションがWindows7でどのように処理されるかに関して何が変わったのかProcess.Start、また、エクスプローラーからファイルを起動するのとまったく同じように動作しないのはなぜかわかりません。Startメソッドのより高度なバージョンを使用しProcessStartInfo、に設定UseShellExecuteしても効果trueがなかったことは言及する価値があります。
最初に起動cmdしてProcess.Startから起動しようとすると、x.abcまったく同じ問題が発生します。環境設定をcmd手動で開始したものと比較すると、ProgramFiles定義方法に違いがあります(最初の設定はを指しC:\Program Files (x86)、2番目の設定はを指しC:\Program Filesます)。.NETアプリケーションから開始されたアプリケーションは、32ビットエミュレーションレイヤー(SysWoW64)で開始されます。
x.abc32ビットバージョンのコマンドプロンプト(つまり、%windir%\SysWoW64\cmd.exe)を起動し、プロンプトで入力することで、の起動の失敗を再現することができましx.abcた。%windir%\Sysnative\cmd.exe /C x.abcまた、醜い回避策を見つけました。これは、の代わりにを起動して、32ビット環境から64ビットのコマンドプロンプトを開始することですx.abc。
しかし、私はむしろそれを行うためのクリーンな方法を使用したいと思います(または、Microsoftの担当者に、これは確かにWindows 7やClickOncceの問題であり、まもなく修正されると教えてもらいます)。