Quel est le moyen le plus simple de créer un programme d’installation Windows auto-extractible de type zip (SFX) qui utilisera le répertoire Windows Temp?

J’ai un programme très simple qui consiste en un exe .NET 2.0 (Program.exe) qui appelle un Win32 .dll x86 (Lib.dll).

Je voudrais regrouper ces fichiers dans un seul fichier zip auto-extractible (SFX) appelé Tool.exe Tool.exe qui extrait les fichiers (Program.exe et Lib.dll) dans le répertoire système Windows Temp, puis appelle Program.exe.

De cette façon, je peux proposer un téléchargement .exe en fichier unique appelé Tool.exe et, pour autant que l’utilisateur le craint, ils exécutent simplement Tool.exe et non un programme multi-fichiers.

WinRAR dispose de capacités SFX et de la possibilité de lancer automatiquement un fichier .exe extrait, mais il ne semble pas vous donner la possibilité de l’extraire dans le répertoire Windows Temp (vous pouvez spécifier un chemin absolu, mais le répertoire Temp varie en fonction de quelle version de Windows). En outre, il ouvre une fenêtre lors de l’extraction, ce qui est exagéré pour mon objective de le faire apparaître comme si l’utilisateur ne faisait que lancer mon programme.

Sinon, existe-t-il un moyen de regrouper le fichier Lib.dll natif dans mon exécutable .NET compilé, presque comme une “ressource”?

Je voudrais vraiment éviter de faire un MSI complet ou même un programme d’installation .exe normal, car cela pose un problème, même avec des programmes d’installation plus simples comme NSIS.

J’ai tendance à faire cela avec juste 7-zip et UPX , en suivant ces instructions pour le faire exécuter un fichier batch lors de l’exécution / extraction . Voici un exemple de script CMD que j’utilise pour créer le fichier EXE, y compris les fichiers du répertoire. \ Bin:

pushd %~dp0 upx --ultra-brute 7zsd.sfx cd Bin ..\7za a -mx=9 "..\Program.7z" * cd .. copy /b 7zsd.sfx + Config.txt + Program.7z Program_Name.exe del Program.7z 

Le fichier config.txt se lit comme suit:

 ;!@Install@!UTF-8! GUIMode="0" RunProgram="runme.cmd" ;!@InstallEnd@! 

Votre kilométrage peut varier, bien sûr …

NSIS a un utilitaire utile appelé Zip2Exe. Fondamentalement, vous lui donnez un fichier zip et spécifiez le dossier d’extraction (dans votre cas, $TEMP ) et il génère un installateur.

Vous pouvez exécuter un tel programme d’installation en mode silencieux (pour que l’utilisateur ne puisse pas réellement voir le programme d’installation). Ainsi, vous pouvez peut-être installer Tool.exe et exécuter le programme pour vous. Le programme d’installation peut être une ressource incorporée que vous écrivez d’abord dans un fichier temporaire avant de l’exécuter. Ensuite, l’utilisateur ne connaît jamais aucun installateur. De leur sharepoint vue, Tool.exe fait un peu de travail, donne des commentaires “veuillez patienter …”, puis le programme que vous souhaitez exécuter est démarré et Tool.exe ferme.

Edit: Avec le recul, vous pourriez trouver plus facile d’extraire et d’exécuter Program.exe (et votre dll) à partir de Tool.exe , puis de quitter Tool.exe . Mieux encore: laissez l’utilisateur exécuter Program.exe (qui écrit lib.dll sur le disque avant de le charger).

J’espère que cela vous donnera des idées. Sachez que vous pouvez avoir des problèmes avec les UAC et les parsingurs de virus.

DotNetZip peut produire un SFX, avec un répertoire d’extraction par défaut. Lorsque vous créez le SFX, spécifiez% TEMP% comme emplacement d’extraction par défaut et, lorsque le SFX est réellement exécuté, la variable est résolue. DotNetZip peut également exécuter un programme après avoir extrait le SFX, et ce programme peut être l’un des éléments extraits.

Vous pouvez donc utiliser DotNetZip pour faire ce que vous voulez.

Une alternative est expliquée dans cet article . Il montre comment effectuer des appels dynamics dans des DLL Win32 natives à partir de .NET. À l’aide de cette technique, vous pouvez regrouper la bibliothèque en tant que ressource dans votre fichier EXE .NET, puis, une fois que .NET EXE a démarré, extrayez la bibliothèque et y intégrez les appels dynamics.