web-dev-qa-db-ja.com

インストール後にClickOnceファイルの関連付けを手動で登録するにはどうすればよいですか?

Microsoftの ClickOnce展開システム は、 Visual Studio展開プロセスに組み込まれている である使いやすいファイルの関連付けマネージャーを提供します。開発者は、ユーザーがClickOnceインストーラーを実行すると、アプリケーションに自動的に関連付けられる最大8つのファイルの関連付けを追加できます。

ただし、さらに一歩進めたいと思います。ユーザーがインストール後に追加のファイルの関連付けを手動で追加または削除できるようにしたい私のアプリケーション内。

これを達成する動機は2つあります。

  • ユーザーに追加のファイルの関連付けを「強制」することはしません。これは、ClickOnce展開によるファイルの関連付けが処理される方法です。
  • ユーザーは、自由に独自のファイルの関連付けを追加または削除できます。

トリッキーな部分:ファイルタイプを実行可能ファイルに直接関連付けることは、ClickOnceデプロイメントと互換性がありません

従来のWindowsアプリケーションとは異なり、ClickOnceアプリケーションは実行可能ファイルを介して直接起動されません。代わりに、ClickOnceマジックをバックグラウンドで処理する特別な.appref-msショートカットを介して起動されます(自動更新、%LOCALAPPDATA%の難読化されたディレクトリでの実行可能ファイルの検索など)。

ClickOnceでデプロイされたアプリを実行可能ファイルを介して直接開くと、自動更新が無効になり、ClickOnce固有のメソッドが機能しなくなります。このため、従来のレジストリファイルの関連付けは私のユースケースでは不可能です。

VisualStudioがClickOnceファイルの関連付けを処理する方法

次の画像は、Visual Studio2010に組み込まれているClickOnceファイルの関連付けマネージャーを示しています。この情報は、アプリケーションの.manifestファイルに保存され、インストール時にWindowsレジストリに追加されます。

VS2010's ClickOnce File Association Manager

レジストリを掘り下げて、ClickOnceインストーラーによって作成されたいくつかのエントリを特定して、ファイルタイプをClickOnceでデプロイされたアプリケーションに関連付けました。

レジストリで見つけたClickOnceファイルタイプの関連付けのレジストリキーの例:

rundll32.exe dfshim.dll, ShOpenVerbExtension {ae74407a-1faa-4fda-9056-b178562cf98f} %1

ここで、{ae74407a-1faa-4fda-9056-b178562cf98f}はGUIDは、関連するアプリケーションのレジストリ内の他のいくつかの場所で使用されます。

私の目標は、ファイルをClickOnceでデプロイされたアプリケーションに手動で関連付けるために、レジストリに(プログラムで)追加する必要のある情報を学習することです。

どんな助けでも大歓迎です!

44
Evan Wondrasek

同じ問題を経験し、深刻な掘り下げを行った後、私は解決策があると思います。 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つの新しいサブキーShellshellexを作成します。

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アプリケーションサポートライブラリ]エントリが追加されるだけであることに注意してください。

これが私以外の誰かのために働くことを願っています、そして長い曲がりくねった例を申し訳ありません。

2
FA Servers

Windows Sysinternals Process Monitor(以前はRegMonと呼ばれていました)を使用して、追加するレジストリキーを把握できます。

デフォルトのファイルの関連付けでClickOnceを使用してアプリをインストールするときに、イベントをキャプチャします。それはすべてのレジストリ操作(それらの多く)を記録します。

レジストリキーを簡単に識別するには、いくつかのフィルタを使用する必要があります。

2
Vishalgiri

Assocコマンドはどうですか?

http://support.Microsoft.com/kb/184082


ファイル拡張子の関連付けを表示または変更します

ASSOC [.ext [= [fileType]]]

.extファイルタイプをfileTypeに関連付けるファイル拡張子を指定しますファイル拡張子に関連付けるファイルタイプを指定します

現在のファイルの関連付けを表示するには、パラメーターなしでASSOCと入力します。 ASSOCがファイル拡張子だけで呼び出された場合、そのファイル拡張子の現在のファイルの関連付けが表示されます。ファイルタイプに何も指定しないと、コマンドはファイル拡張子の関連付けを削除します。


ファイルの関連付けは、マシンレベルまたはユーザーレベルにすることができます-通常、HKCR領域にあるものは、マシンレベルのファイルの関連付け用です。 HKCU /ソフトウェア/クラス領域にあるものは、ユーザーがカスタマイズした(またはユーザーがカスタマイズした)ユーザーごとのものです。 「assoc」のようなものは、XP、7、そしておそらくWin 8で動作します(私はまだwin 8でこのコマンドを使用していませんが)。

1
Justin C

回避策:次の場所にあるClickOnceアプリケーションのショートカットに関連付けることができます。

C:\Users\[Your username]\AppData\Roaming\Microsoft\Windows\Start Menu\[Program folder]\[Shortcut name]
1
Marko Krizmanic

ファイルの関連付けを手動で登録したい場合、それは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-----");
    }
1
tyh20082000