Microsoftの ClickOnce展開システム は、 Visual Studio展開プロセスに組み込まれている である使いやすいファイルの関連付けマネージャーを提供します。開発者は、ユーザーがClickOnceインストーラーを実行すると、アプリケーションに自動的に関連付けられる最大8つのファイルの関連付けを追加できます。
ただし、さらに一歩進めたいと思います。ユーザーがインストール後に追加のファイルの関連付けを手動で追加または削除できるようにしたい私のアプリケーション内。
これを達成する動機は2つあります。
従来のWindowsアプリケーションとは異なり、ClickOnceアプリケーションは実行可能ファイルを介して直接起動されません。代わりに、ClickOnceマジックをバックグラウンドで処理する特別な.appref-ms
ショートカットを介して起動されます(自動更新、%LOCALAPPDATA%
の難読化されたディレクトリでの実行可能ファイルの検索など)。
ClickOnceでデプロイされたアプリを実行可能ファイルを介して直接開くと、自動更新が無効になり、ClickOnce固有のメソッドが機能しなくなります。このため、従来のレジストリファイルの関連付けは私のユースケースでは不可能です。
次の画像は、Visual Studio2010に組み込まれているClickOnceファイルの関連付けマネージャーを示しています。この情報は、アプリケーションの.manifestファイルに保存され、インストール時にWindowsレジストリに追加されます。
レジストリを掘り下げて、ClickOnceインストーラーによって作成されたいくつかのエントリを特定して、ファイルタイプをClickOnceでデプロイされたアプリケーションに関連付けました。
レジストリで見つけたClickOnceファイルタイプの関連付けのレジストリキーの例:
rundll32.exe dfshim.dll, ShOpenVerbExtension {ae74407a-1faa-4fda-9056-b178562cf98f} %1
ここで、{ae74407a-1faa-4fda-9056-b178562cf98f}
はGUIDは、関連するアプリケーションのレジストリ内の他のいくつかの場所で使用されます。
私の目標は、ファイルをClickOnceでデプロイされたアプリケーションに手動で関連付けるために、レジストリに(プログラムで)追加する必要のある情報を学習することです。
どんな助けでも大歓迎です!
同じ問題を経験し、深刻な掘り下げを行った後、私は解決策があると思います。 Evan Wondrasekはrundllコマンドで正しい道を進んでおり、テスト環境で次のものを動作させることができました。
基本的に、Uri Abramsonは、rundll.exeコマンドのGuidがclickonceアプリケーションへの参照であるということは正しかったのですが、レジストリの他の場所には表示されません。それが参照しているのは、実際にはHKCU\Software\Classes
の他のキーです。
ファイル参照を機能させるには、最初にアプリケーションにProgID
が必要です。私の知る限り、これは必要なものでも、VisualStudioのClickOnce発行メニューで通常設定するものでもかまいません。
また、新しいGUIDを作成し、アプリケーション参照(.appref-ms)ファイルの内容を知っている必要があります。
私の例では、以下を使用します。
ProgId: FASERVER.TestApp
Guid: ce6b2c69-ec54-4182-a87f-74c5dfe1a03e
AppRefFileContents: http://SomeAddress.SomeDomain/TestApp/TestApp.application#TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
次のコードでは、上記の値と同等のものを使用してください。
まず、HKCU\Software\Classes
の下にFASERVER.TestApp
という名前の新しいレジストリキーを次の文字列で作成します。
(Default) = SomeFileType
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
これらの値を設定したら、2つの新しいサブキーShell
とshellex
を作成します。
Shell
の(Default)
値をopen
に設定します。次に、Shell
と呼ばれるopen
のサブキーと、open
と呼ばれるcommand
のサブキーを作成します。 command
の(Default)
値を次のように設定します。
rundll32.exe dfshim.dll, ShOpenVerbExtension {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} %1
shellex
と呼ばれるIconHandler
のサブキーを作成し、その(Default)
値を{ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
に設定します
HKCU\Software\Classes\CLSID
に移動し、次の文字列を使用して新しいキー{ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
を作成します。
(Default) = Shell Icon Handler For Tif File
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
IconFile = YourIconFile.ico
注:アイコンはClickOnceプロジェクトに含まれている必要があります。
次に、{ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
の下にInProcServer32
というサブキーを次の値で作成します。
(Default) = dfshim.dll
ThreadingModel = Apartment
最後に、前のキーを必要なファイルの関連付けにリンクする必要があります。これを行うには、HKCU\Software\Classes
に移動し、必要なファイル拡張子ごとに次の手順を実行します。
FileExt文字列を次のように設定します。
(Default) = FASERVER.TestApp
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
それでおしまい!やるべきです。
これにより、アプリケーションがそのファイルタイプのデフォルトプログラムとして設定されるのではなく、[プログラムから開く]メニューに[ClickOnceアプリケーションサポートライブラリ]エントリが追加されるだけであることに注意してください。
これが私以外の誰かのために働くことを願っています、そして長い曲がりくねった例を申し訳ありません。
Windows Sysinternals Process Monitor(以前はRegMonと呼ばれていました)を使用して、追加するレジストリキーを把握できます。
デフォルトのファイルの関連付けでClickOnceを使用してアプリをインストールするときに、イベントをキャプチャします。それはすべてのレジストリ操作(それらの多く)を記録します。
レジストリキーを簡単に識別するには、いくつかのフィルタを使用する必要があります。
Assocコマンドはどうですか?
http://support.Microsoft.com/kb/184082
ファイル拡張子の関連付けを表示または変更します
ASSOC [.ext [= [fileType]]]
.extファイルタイプをfileTypeに関連付けるファイル拡張子を指定しますファイル拡張子に関連付けるファイルタイプを指定します
現在のファイルの関連付けを表示するには、パラメーターなしでASSOCと入力します。 ASSOCがファイル拡張子だけで呼び出された場合、そのファイル拡張子の現在のファイルの関連付けが表示されます。ファイルタイプに何も指定しないと、コマンドはファイル拡張子の関連付けを削除します。
ファイルの関連付けは、マシンレベルまたはユーザーレベルにすることができます-通常、HKCR領域にあるものは、マシンレベルのファイルの関連付け用です。 HKCU /ソフトウェア/クラス領域にあるものは、ユーザーがカスタマイズした(またはユーザーがカスタマイズした)ユーザーごとのものです。 「assoc」のようなものは、XP、7、そしておそらくWin 8で動作します(私はまだwin 8でこのコマンドを使用していませんが)。
回避策:次の場所にあるClickOnceアプリケーションのショートカットに関連付けることができます。
C:\Users\[Your username]\AppData\Roaming\Microsoft\Windows\Start Menu\[Program folder]\[Shortcut name]
ファイルの関連付けを手動で登録したい場合、それはClickOnceの仕事ではありません。レジストリにキーを手動で追加して、ファイルの関連付けを設定できます。また、clickonceで設定された関連付けを削除する場合は、レジストリキーを削除するだけです。
private static void SetFileAssociation(string icon, string application, string openArg, string extension , string progId , string description )
{
Trace.WriteLine("-----Create File Association-----");
RegistryKey classesKey = Registry.CurrentUser.OpenSubKey(@"Software\Classes", true);
classesKey.CreateSubKey(extension).SetValue(string.Empty, progId);
RegistryKey progKey = classesKey.CreateSubKey(progId);
if (description != null)
{
progKey.SetValue(string.Empty, description);
}
if (icon != null)
{
progKey.CreateSubKey("DefaultIcon").SetValue(string.Empty, icon);
}
progKey.CreateSubKey(@"Shell\Open\Command").SetValue(string.Empty,
application + openArg);
Trace.WriteLine("-----Finish File Association-----");
}