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.
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
Où {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!
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.
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\Classes
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 nouvelles sous-clés shell
et shellex
.
mettez le (Default)
valeur shell
open
. Ensuite, créez une sous-clé de shell
open
, et une sous-clé de open
command
. 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 shellex
IconHandler
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.
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).
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-----");
}
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]