Comment enregistrer manuellement les associations de fichiers ClickOnce après l'installation?

Microsoft système de déploiement ClickOnce offre un gestionnaire d'association de fichiers facile à utiliser qui est intégré au processus de déploiement de Visual Studio. Les développeurs peuvent ajouter jusqu'à 8 associations de fichiers qui seront automatiquement associées à leur application lorsque L'utilisateur exécute L'installateur ClickOnce.

j'aimerais aller un peu plus loin: je veux permettre aux utilisateurs d'ajouter ou de supprimer manuellement supplémentaire le fichier associations après installation à partir de mon application.

j'ai deux motivations pour arriver à ce résultat:

  • Je ne vais pas "forcer" des associations de fichiers supplémentaires sur l'utilisateur, ce qui est la façon dont les associations de fichiers par le biais de déploiements ClickOnce sont gérées.
  • les Utilisateurs peuvent ajouter ou supprimer leurs propres associations de fichiers à leurs loisirs.

la partie délicate: associer directement un type de fichier à un exécutable n'est pas compatible avec les déploiements ClickOnce

Contrairement aux applications Windows traditionnelles, les applications ClickOnce ne sont pas lancées directement via leur exécutable. Au lieu de cela, ils sont lancés via un.appref-ms raccourci qui gère la magie de ClickOnce dans les coulisses (mises à jour automatiques, localisation des fichiers exécutables dans un répertoire obscurci en %LOCALAPPDATA%, etc).

si une application déployée par ClickOnce est ouverte directement via son exécutable, les mises à jour automatiques sont désactivées et Les méthodes spécifiques à ClickOnce ne fonctionneront plus. Pour cette raison, les associations traditionnelles de fichiers de Registre ne sont pas possibles pour mon cas d'utilisation.

comment Visual Studio gère les associations de fichiers ClickOnce

L'image ci-dessous montre le gestionnaire d'association de fichiers ClickOnce intégré à Visual Studio 2010. Ces informations sont stockées dans l'application .manifeste fichier et est ajouté au Registre Windows sur installation.

VS2010's ClickOnce File Association Manager

j'ai fait quelques recherches dans mon registre et j'ai identifié plusieurs entrées faites par L'installateur ClickOnce pour associer des types de fichiers avec L'application déployée ClickOnce.

un exemple de clé de Registre pour une association de type de fichier ClickOnce que j'ai trouvé dans mon registre:

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

{ae74407a-1faa-4fda-9056-b178562cf98f} est un guide utilisé à plusieurs autres endroits dans le Registre pour les application.

mon but est d'apprendre quelles informations doivent être ajoutées au registre (programmatiquement) pour associer manuellement des fichiers avec une application déployée ClickOnce.

toute aide est appréciée!

44
demandé sur Evan Wondrasek 2012-01-10 06:41:24

5 réponses

vous pouvez deviner les clés de Registre à ajouter, en utilisant Windows Sysinternals Process Monitor (précédemment connu sous le nom de RegMon).

Capturez les événements lorsque vous installez votre application en utilisant ClickOnce avec les associations de fichiers par défaut. Il enregistrera toutes les opérations du registre (beaucoup d'entre elles).

vous auriez besoin d'utiliser certains filtres pour identifier facilement les clés de registre.

2
répondu Vishalgiri 2013-05-30 19:37:41

Ok donc après avoir éprouvé le même problème et avoir creusé sérieusement, je pense que j'ai une solution. Evan Wondrasek était sur la bonne voie avec la commande rundll, et j'ai pu obtenir les suivants travailler dans un environnement de test.

essentiellement Uri Abramson avait raison que le guide dans le rundll.la commande exe est une référence à l'application clickonce mais elle n'apparaît nulle part ailleurs dans le registre. Ce qu'il fait référence est en fait les autres clés dans HKCU\Software\Classes.

pour que le fichier de référence fonctionne, vous avez d'abord besoin d'un ProgID pour votre application. À ma connaissance, cela peut être tout ce que vous voulez, ou ce que vous avez l'habitude de mettre dans le menu Édition de ClickOnce dans Visual Studio.

vous aurez également besoin de créer un nouveau Guid, et connaître le contenu de votre référence D'Application (.appref-ms) fichier.

Pour mon exemple, je vais utiliser le code suivant:

ProgId: FASERVER.TestApp
Guid: ce6b2c69-ec54-4182-a87f-74c5dfe1a03e
AppRefFileContents: http://SomeAddress.SomeDomain/TestApp/TestApp.application#TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86

veuillez utiliser votre équivalent de les valeurs ci-dessus dans le code suivant.

Pour commencer, créez une nouvelle clé de registre sous HKCU\Software\ClassesFASERVER.TestApp avec les chaînes suivantes:

(Default) = SomeFileType
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

une fois que vous avez défini ces valeurs, créez deux nouvelles sous-clés shell et shellex.

mettez le (Default) valeur shellopen. Ensuite, créez une sous-clé de shellopen, et une sous-clé de opencommand. Définissez (Default) valeur command pour le suivantes:

rundll32.exe dfshim.dll, ShOpenVerbExtension {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} %1

Créer une sous-clé de shellexIconHandler et définissez sa (Default) la valeur {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

Accédez à HKCU\Software\Classes\CLSID et créer une nouvelle clé {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} avec les chaînes suivantes:

(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

Note: votre icône doit être dans votre projet ClickOnce.

maintenant créer une sous-clé sous {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}InProcServer32 avec les valeurs suivantes:

(Default) = dfshim.dll
ThreadingModel = Apartment

enfin nous avons besoin de relier les touches précédentes avec le fichier les associations que nous désirons. Pour ce faire, accédez à HKCU\Software\Classes et faites ce qui suit pour chaque extension de fichier désirée.

définir les chaînes FileExt comme suit:

(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}

C'est ça! Vous devriez faire.

veuillez noter que ceci ne définira pas votre application comme le programme par défaut pour ce type de fichier, mais ajoutera simplement une entrée "ClickOnce Application Support Library" au menu "Ouvrir avec".

Espérons que cela fonctionne pour quelqu'un d'autre que moi et désolé pour le de longue haleine exemple.

2
répondu FA Servers 2014-05-24 02:10:54

Qu'en est-il de la commande Assoc?

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


assoc/?

affiche ou modifie les associations d'extension de fichier

ASSOC [.ext[=[type de fichier]]]

.ext spécifie l'extension du fichier pour associer le type de fichier avec type Spécifie le type de fichier à associer avec l'extension de fichier

taper ASSOC sans paramètres pour afficher le fichier courant Association. Si ASSOC est invoqué avec juste une extension de fichier, il affiche le courant association de fichier pour cette extension de fichier. Spécifiez rien pour le fichier tapez et la commande supprimera l'association pour l'extension du fichier.


les associations de fichiers peuvent être au niveau de la machine ou de l'utilisateur - En général, le contenu dans la zone HKCR est pour les associations de fichiers au niveau de la machine. Le contenu dans la zone HKCU / Software / Classes est le contenu par utilisateur que l'Utilisateur a personnalisé (ou que vous avez personnalisé pour ils.) Quelque chose comme" assoc " fonctionnera sur XP, 7, et probablement Win 8 (bien que je n'ai pas encore utilisé ce cmd sur win 8).

1
répondu Justin C 2012-12-26 15:06:55

si vous voulez enregistrer manuellement l'association de fichiers, ce n'est pas L'affaire de ClickOnce. vous pouvez ajouter manuellement des clés au Registre pour setuber l'association de fichiers. Et si vous voulez supprimer l'association qui est définie par clickonce, il suffit de supprimer la clé de registre.

    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
répondu tyh20082000 2013-05-10 01:57:08

solution de Contournement: Vous pouvez vous associer avec le raccourci de L'application ClickOnce situé dans:

C:\Users\[Your username]\AppData\Roaming\Microsoft\Windows\Start Menu\[Program folder]\[Shortcut name]
0
répondu Marko Krizmanic 2015-09-11 12:42:15