Après de nombreuses recherches (et discussions), la réponse est simplement que la version actuelle de ClickOnce ne fonctionne pas de cette façon. Le programme d'installation ne transmet pas l'URL à l'application lors de sa première exécution.
Voici ce que j'ai fait comme solution de rechange (et cela fonctionne très bien).
-
Modifier mon paquetage d'installation pour qu'il contienne tous les fichiers requis non compressés et détachés (au lieu d'utiliser un fichier CAB ou de les intégrer dans le programme d'installation).
-
Créez une application ASP.NET (en utilisant le routage pour la gestion des URL) qui attend une requête vers "mysite.com/Installer/00123/Setup.exe".
- Note : la route doit écouter "/Installer/{ID}/*" où {ID} est composé de 5 chiffres.
- En fait, il n'y a pas de répertoire appelé "00123", mais j'utilise plutôt ASP.NET Routing pour récupérer ces requêtes et les faire correspondre à mon répertoire réel qui contient le fichier d'installation.
-
Je détourne ensuite la requête (j'analyse le setup.exe pour trouver l'URL intégrée qui indique au programme d'installation où trouver le reste des fichiers...). Je remplace ensuite "/00000/" par l'URL de la requête sur laquelle l'utilisateur s'est rendu - dans ce cas "00123".
- À mesure que chaque fichier est demandé, je sais quelle " version " du fichier envoyer, car l'installateur ClickOnce cherchera " mysite.com/Installer/00123/SomeFile.dll " (ou autre).
Au lieu d'utiliser un identifiant à 5 chiffres, vous pourriez utiliser un GUID... c'est vous qui voyez.
Cette solution fonctionne très bien pour notre organisation... nous avons actuellement 37 clients qui exigent des personnalisations uniques de leur paquet d'installation, mais nous n'avons qu'à construire et publier réellement ONE et utilisez simplement la méthode de détournement ci-dessus.
À ce stade, nous disposons d'espaces réservés que nous remplaçons afin de pouvoir personnaliser facilement les installateurs pour autant de clients que nous le souhaitons.
Exemple : dans le fichier app.config, nous avons displayName="{OrgName}" qui est automatiquement remplacé par l'une des valeurs de la base de données.