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

Le système de déploiement ClickOnce de Microsoft offre un gestionnaire d’association de fichiers facile à utiliser, intégré au processus de déploiement de Visual Studio . Les développeurs peuvent append jusqu’à 8 associations de fichiers qui seront automatiquement associées à leur application lorsque l’utilisateur exécutera le programme d’installation de ClickOnce.

Je voudrais toutefois aller encore plus loin: je veux autoriser les utilisateurs à append ou à supprimer manuellement des associations de fichiers supplémentaires après l’installation à partir de mon application.

J’ai deux motivations pour accomplir ceci:

  • Je ne vais pas forcer des associations de fichiers supplémentaires sur l’utilisateur, ce qui permet de gérer les associations de fichiers via les déploiements ClickOnce.
  • Les utilisateurs peuvent append ou supprimer leurs propres associations de fichiers uniques à loisir.

La partie délicate: l’association directe d’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 spécial .appref-ms qui gère la magie ClickOnce en arrière-plan (mises à jour automatiques, localisation des fichiers exécutables dans un répertoire obscurci dans %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 fonctionnent plus. De ce fait, les associations de fichiers de registre classiques ne sont pas possibles pour mon cas d’utilisation.

Comment Visual Studio gère les associations de fichiers ClickOnce

L’image ci-dessous illustre le gestionnaire d’associations de fichiers ClickOnce intégré à Visual Studio 2010. Ces informations sont stockées dans le fichier .manifest de l’application et sont ajoutées au registre Windows lors de l’installation.

Gestionnaire d'association de fichiers ClickOnce de VS2010

J’ai effectué quelques recherches dans mon registre et identifié plusieurs entrées effectuées par le programme d’installation de ClickOnce pour associer les types de fichiers à l’application déployée ClickOnce.

Un exemple de clé de registre pour une association de type de fichier ClickOnce trouvée dans mon registre:

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

{ae74407a-1faa-4fda-9056-b178562cf98f} est un GUID utilisé à plusieurs autres endroits du registre pour l’application associée.

Mon objective est d’apprendre quelles informations doivent être ajoutées au registre (par programme) pour associer manuellement des fichiers à une application déployée ClickOnce.

Toute aide est appréciée!

Vous pouvez déterminer les clés de registre à append à l’aide de Windows Sysinternals Process Monitor (précédemment appelé RegMon).

Capturer des événements lorsque vous installez votre application à l’aide de ClickOnce avec des associations de fichiers par défaut. Il enregistrera toutes les opérations de registre (beaucoup d’entre elles).

Vous devrez utiliser des filtres pour identifier facilement les clés de registre.

Ok, après avoir rencontré le même problème et avoir fait des recherches sérieuses, je pense avoir une solution. Evan Wondrasek était sur la bonne voie avec la commande rundll et j’ai pu faire fonctionner les éléments suivants dans un environnement de test.

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

Pour que le fichier de référence fonctionne, vous devez d’abord disposer d’un ProgID pour votre application. À ma connaissance, cela peut être ce que vous voulez, ou tout ce que vous définiriez normalement dans le menu de publication de ClickOnce dans Visual Studio.

Vous devrez également créer un nouveau Guid et connaître le contenu de votre fichier de référence d’application (.appref-ms).

Pour mon exemple, je vais utiliser les éléments suivants:

 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 des valeurs ci-dessus dans le code suivant.

Pour commencer, créez une nouvelle clé de registre sous HKCU\Software\Classes appelée FASERVER.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 nouveaux shell et shellex .

Définissez la valeur (Default) du shell à open . Ensuite, créez une sous-clé de shell appelée open et une sous-clé de command appelée open . Définissez la valeur (Default) de la command comme suit:

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

Créez une sous-clé de shellex appelée IconHandler et définissez sa valeur (Default) sur {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

Naviguez jusqu’à HKCU\Software\Classes\CLSID et créez 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 

Remarque: votre icône doit figurer dans votre projet ClickOnce.

Maintenant, créez une sous-clé sous {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} appelée InProcServer32 avec les valeurs suivantes:

 (Default) = dfshim.dll ThreadingModel = Apartment 

Enfin, nous devons associer les clés précédentes aux associations de fichiers souhaitées. Pour ce faire, accédez à HKCU\Software\Classes et procédez comme suit pour chaque extension de fichier souhaitée.

Définissez 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 tout! Vous devriez être fait.

Veuillez noter que cela ne définira pas votre application comme programme par défaut pour ce type de fichier, mais appenda simplement une entrée “ClickOnce Application Support Library” au menu “Ouvrir avec”.

J’espère que cela fonctionne pour quelqu’un d’autre que moi et désolé pour l’exemple long.

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 de fichier pour associer le type de fichier à fileType Spécifie le type de fichier à associer à l’extension de fichier

Tapez ASSOC sans parameters pour afficher les associations de fichiers en cours. Si ASSOC est invoqué avec une simple extension de fichier, il affiche l’association de fichiers actuelle pour cette extension de fichier. Ne spécifiez rien pour le type de fichier et la commande supprimera l’association pour l’extension de fichier.


Les associations de fichiers peuvent être de niveau machine ou utilisateur – En règle générale, les éléments de la zone HKCR concernent les associations de fichiers de niveau machine. Les éléments de la zone HKCU / Software / Classes sont des éléments par utilisateur que l’utilisateur a personnalisés (ou personnalisés). Quelque chose comme “assoc” fonctionnera sur XP, 7, et probablement sur Win 8 (bien que je n’ai pas encore utilisé cette cmd sur win 8).

Si vous souhaitez enregistrer manuellement l’association de fichiers, il ne s’agit pas de l’activité de ClickOnce. Vous pouvez append manuellement des clés au registre pour créer une association de fichiers. Et si vous souhaitez supprimer l’association définie par clickonce, supprimez simplement la clé de registre.

  private static void SetFileAssociation(ssortingng icon, ssortingng application, ssortingng openArg, ssortingng extension , ssortingng progId , ssortingng description ) { Trace.WriteLine("-----Create File Association-----"); RegistryKey classesKey = Registry.CurrentUser.OpenSubKey(@"Software\Classes", true); classesKey.CreateSubKey(extension).SetValue(ssortingng.Empty, progId); RegistryKey progKey = classesKey.CreateSubKey(progId); if (description != null) { progKey.SetValue(ssortingng.Empty, description); } if (icon != null) { progKey.CreateSubKey("DefaultIcon").SetValue(ssortingng.Empty, icon); } progKey.CreateSubKey(@"Shell\Open\Command").SetValue(ssortingng.Empty, application + openArg); Trace.WriteLine("-----Finish File Association-----"); } 

Solution: vous pouvez associer un raccourci de l’application ClickOnce situé dans:

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