44 votes

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é dans le 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écutera le programme d'installation de ClickOnce.

J'aimerais aller un peu plus loin, cependant : Je veux permettre aux utilisateurs d'ajouter ou de supprimer manuellement supplémentaire les associations de fichiers après l'installation à partir de mon application.

J'ai deux motivations pour accomplir cette tâche :

  • Je ne " forcerai " pas les associations de fichiers supplémentaires à l'utilisateur, ce qui est la façon dont les associations de fichiers sont gérées par les déploiements ClickOnce.
  • Les utilisateurs peuvent ajouter ou supprimer leurs propres associations de fichiers uniques à leur guise.

La partie délicate : L'association directe d'un type de fichier à un exécutable n'est pas compatible avec les déploiements de ClickOnce.

Contrairement aux applications Windows traditionnelles, les applications ClickOnce ne sont pas lancées directement via leur exécutable. Au lieu de cela, elles sont lancées via un programme spécial .appref-ms qui gère la magie de ClickOnce en coulisse (mises à jour automatiques, localisation des fichiers exécutables dans un répertoire obfusqué dans le dossier de l'ordinateur). %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. Pour cette raison, les associations traditionnelles de fichiers de registre ne sont pas possibles dans mon cas d'utilisation.

Comment Visual Studio gère les associations de fichiers ClickOnce

L'image ci-dessous illustre le gestionnaire d'association 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.

VS2010's ClickOnce File Association Manager

J'ai fait quelques recherches dans mon registre et j'ai identifié plusieurs entrées faites par le programme d'installation de ClickOnce pour associer des types de fichiers à l'application déployée par 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 GUID utilisé à plusieurs autres endroits dans le registre pour l'application associée.

Mon objectif est d'apprendre quelles informations doivent être ajoutées au registre (de manière programmatique) pour associer manuellement des fichiers à une application déployée par ClickOnce.

Toute aide est appréciée !

2voto

Vishalgiri Points 424

Vous pouvez déterminer 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'opérations).

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

2voto

FA Servers Points 81

Ok, après avoir rencontré le même problème et fait quelques recherches sérieuses, je pense avoir trouvé une solution. Evan Wondrasek était sur la bonne voie avec la commande rundll, et j'ai pu faire fonctionner ce qui suit 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 il n'apparaît nulle part ailleurs dans le registre. Ce qu'elle référence est en fait les autres clés dans le registre de HKCU\Software\Classes .

Pour que la référence au fichier fonctionne, vous avez d'abord besoin d'un fichier ProgID pour votre application. À ma connaissance, il peut s'agir de ce que vous voulez, ou de ce que vous auriez normalement défini 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 ce qui suit :

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é FASERVER.TestApp avec les chaînes de caractères 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 .

Définissez le (Default) valeur de shell à open . Créez ensuite une sous-clé de shell appelé open et une sous-clé de open appelé command . Réglez le (Default) valeur de command à ce qui suit :

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

Créez une sous-clé de shellex appelé IconHandler et définir son (Default) à la valeur {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}

Naviguez vers HKCU\Software\Classes\CLSID et créer une nouvelle clé {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} avec les chaînes de caractères 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 se trouver dans votre projet ClickOnce.

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

(Default) = dfshim.dll
ThreadingModel = Apartment

Enfin, nous devons lier les clés précédentes avec les associations de fichiers que nous souhaitons. Pour ce faire, naviguez jusqu'à 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 avoir terminé.

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

J'espère que cela fonctionnera pour quelqu'un d'autre que moi et je m'excuse pour cet exemple interminable.

1voto

Justin Choponis Points 74

Et la commande Assoc ?

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


assoc / ?

Affiche ou modifie les associations d'extensions de fichiers

ASSOC [.ext[=[fileType]]]

.ext Spécifie l'extension de fichier à laquelle associer le type de fichier fileType Spécifie le type de fichier à associer à l'extension de fichier

Tapez ASSOC sans paramètres pour afficher les associations de fichiers actuelles. Si ASSOC est invoqué avec seulement une extension de fichier, il affiche l'association de actuelle pour cette extension de fichier. Si vous ne spécifiez rien pour le type de fichier type de fichier et la commande supprimera l'association pour l'extension de fichier.


Les associations de fichiers peuvent être au niveau de la machine ou de l'utilisateur. En général, les éléments de la zone HKCR concernent les associations de fichiers au niveau de la machine. Les éléments de la zone HKCU/Software/Classes sont des éléments personnalisés par l'utilisateur (ou que vous avez personnalisés pour lui). Quelque chose comme "assoc" fonctionnera sur XP, 7, et probablement Win 8 (bien que je n'aie pas encore utilisé cette commande sur Win 8).

1voto

Stu Points 7999

Y a-t-il quelque chose qui ne va pas avec les instructions ici ?

http://msdn.microsoft.com/en-us/library/bb892924.aspx

1voto

tyh20082000 Points 19

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 configurer 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-----");
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X