Cet article explore l'association d'un type de fichier avec une application développée en C#.NET. Je commence par évoquer les mécanismes Windows qui permettent cela pour ensuite voir comment un code C# peut actionner ces mécanismes, puis finalement comment les outils intégrés à l'IDE Visual Studio peuvent le faire…
Ce sample FileAsso.exe montre les différentes façons d'associer des fichiers. Depuis Windows 2000, des privilèges élevés sont nécessaires pour faire une association de fichier pour l'ensemble des utilisateurs (HKEY_LOCAL_MACHINE). Pour éviter les difficultés inhérentes aux privilèges, il est recommandé par certains sur StackOverflow de faire une association de fichier par utilisateur (HKEY_CURRENT_USER).
La base de registre
La base de registre associe type de fichier et programme. Pour comprendre le mécanisme, on peut lire la méthode pour inscrire soit-même les clés nécessaires ici ou là.
=> L'association « à la volée »
Cela consiste en un petit executable associée avec une extension qui une fois démarrée va vérifier si l'application principale est lancée et lui passer le fichier, ou sinon lancera l'application. Le principal avantage de cette approche est que l'on ne touche qu'une fois à la base de registre. Les inconvénients sont qu'il faut un helper process et un système de détection de changement pour le signaler à l'utilisateur et lui proposer une réparation.
=> Changer l'association de fichier dans le programme principale
Cela fonctionne avec les utilisateurs non administrateur. Les associations sont dans HKEY_CLASSES_ROOT, qui point à la fois vers HKEY_LOCAL_MACHINE\SOFTWARE\Classes et HKEY_CURRENT_USER\SOFTWARE\Classes. Ainsi, vous pouvez mettre l'association de l'utilisateur courant dans HKCU et « éclipser » l'association d'origine dans HKLM.
Le principal danger, c'est qu'il suffit d'un crash dans votre application pour que l'association devienne permanente et générallement les applications ont du mal à gérer HKCU, donc il y a de grande chance que l'application d'origine ne retrouve jamais l'association qu'elle avait avec son extension.
Environnement .NET
Il semblerait qu'il n'y ait pas d'API .NET pour directement administrer les associations de fichier mais on peut utiliser les classes Registry pour lire et écrire les clés dont on a besoin.
Scripts de la communauté
Il existe des scripts permettant de gérer l'association de fichier.
=> Microsoft.Win32 (Juillet 2006)
Code source qui permet d'associer un icone et un programme à un type de fichier, en manipulant le registre.
=> Les classes FileAssociationInfo and ProgramAssociationInfo (Mars 2007)
C'est un script sur CodeProject qui a l'air plus sérieux que le précédent (en proposant également la gestion de l'icône). On y apprend que les associations de fichiers ont deux aspects : l'extension elle-même et le ProgID (identifiant de programme). L'extension n'a pas l'obligation d'être associé avec un ProgID, mais peut l'être qu'avec un seul. Par contre un ProgID peut avoir de multiples extensions rattachées à lui.
Outils intégrés
La création d'un installeur est une étape importante dans la conception d'un logiciel afin de pouvoir le diffuser le plus efficacement via un package d'installation. Ce dernier est idéal pour effectuer facilement des tâches de configuration des applications. De plus, les associations sont supprimées automatiquement dans le registre lorsque l'application est désinstallée par l'utilisateur. Jusqu'à Visual Studio 2012, l'IDE mettait à disposition un outil pratique mais extrèmement limité à ce sujet : le projet d'installation (et de déploiement). A partir de cette version 2012, il est possible d'installer un addin comme InstallShield ou WiX, ou encore de passer par une application tierce comme Inno Setup.
=> Visual Studio 2005
Il existe ce tuto sur developpez.com qui traite des projets de déploiement avec Visual Studio 2005. On y voit que beaucoup d'aspects relatifs à l'association de fichier sont pris en charge comme le menu contextuel « ouvric avec ».
=> Visual Studio 2010
D'après MSDN,Visual Studio fournit des modèles pour quatre types de projets de déploiement : projet de module de fusion, projet d'installation, projet d'installation Web et projet CAB. De plus, un Assistant Installation vous aide à créer des projets de déploiement. Vous pouvez également activer InstallShield Limited Edition pour créer, générer et empaqueter des applications et des services pour Windows. Cette documentation évoque la possibilité d'organiser la structure de fichier lors du build.
=> Visual Studio 2012 <=
Le type projet d'installation fut abandonné dans Visual Studio 2012, et il est impossible d'utiliser ceux existants (on peut cependant convertir un *.vdproj en WiX en un clic avec VDProj to WiX Converter mais c'est payant). Il faut donc se rabattre sur une de ces solutions :
- Logiciels gratuits limités
-> Un projet InstallShield Limited Edition sous Visual Studio nécessite d'avoir installé InstallShield via ce site.
On voit dans ce tuto sur developpez.com que malgré de grandes restrictions, cette version gratuite d'InstallShield permet d'effectuer un test de compatibilité de l'environnement cible (présence des composants requis), et de coller des icones sur le bureau de ce dernier. Cette documentation expose la possibilité d'effectuer des associations de fichier.
-> D'autres outils moins connus comme WinInstall LE de Scalable Software (c'est la version Community Edition), permettent de créer un installeur. Le principe de WinInstall est de prendre un cliché d'un poste avant installation du logiciel et de faire un autre cliché après installation pour créer un fichier MSI par différence entre les deux clichés du poste. Cette documentation évoque la possibilité de faire des associations de fichier.
- Logiciels gratuits sans limitations
-> Windows Installer XML (WiX) couplé à la GUI WiX EDIT est l'outil officiel de remplacement des Setup de Microsoft.
WiX est un projet OpenSource pour construir des installers windows à partir d'un fichier XML et des librairies additionnelles permettent d'améliorer l'expérience utilisateur. La courbe d'apprentissage est assez longue mais ensuite il est facile de produire en série des installeurs et de plus il est possible de partir de squelette de package WiX mis à disposition. Adopté par SharpDevelop et pouvant s'intégrer à Visual Studio (payant), la compléxité de WiX provient de sa compatibilité avec MSI (Windows Installer), une norme Microsoft robuste intégrant GUI framework, versionning, rollback, désinstallation automatique du logiciel, possibilité d'ajouter grâce à COM des objets dans le fichier (système de fichiers à l'intérieur d'un fichier) grâce à une compatibilité avec Structured storage, le déploiement via Active Directory… D'autre part il respecte une bonne « séparation des privilèges » et prend en charge toutes les conventions standards de répertoire comme « PROGRAM_DATA » ou C:\Documents and Settings\All Users\Application Data ou C:\ProgramData suivant que l'OS est XP ou Vista… Cette documentation traite des associations de fichier dans WiX.
-> Inno Setup couplé avec la GUI Istool.
Jordan Russel n'était pas satisfait d'InstallShield Express fourni avec Borland Delphi, alors il a décidé de créer son propre installateur. Au début peu connu, des fans ont développé ISTool et ScriptMaker pour faciliter la création des scripts. Inno Setup a gagné un Shareware Industry Awards trois fois de suite de 2002 à 2004. On peut comparer l'activité des commits des projets WiX et Inno Setup ici. Il ressort que le principal point fort d'Inno est sa simplicité. Cette documentation explique comment créer une association de fichier avec Inno.
=> ClickOnce (VS2008 SP1)
L'installation ClickOnce permet de gérer les propriétés de projet, la publication, les options, les associatons de fichier… (à noter que cela doit être full-trust, ciblant .NET 3.5, et pour un usage offline).
- Inconvénients :
-> Consiste à avoir de multiple fichier – Il semble plus facile de distribuer un seul fichier.
-> Il faut rebuild pour un CD d'installation (pour ceux qui n'ont pas internet)
-> Le programme n'est pas installé dans Program Files mais dans un répertoire caché, rendant difficile la création d'un raccourci.
- Avantages :
-> Cela marche bien et c'est directement accessible dans VisualStudio.
-> Misa à jour aisée.
Discussion au sujet de ClickOnce visible sur StackOverflow.