Fusionner DLL en EXE?
j'ai deux fichiers DLL que j'aimerais inclure dans mon fichier EXE pour le rendre plus facile à distribuer. J'ai lu un peu ici et là comment faire cela , même trouvé un bon fil ici , et ici , mais c'est beaucoup trop compliqué pour moi et j'ai besoin de véritables instructions de base sur la façon de faire cela.
J'utilise Microsoft Visual C # Express 2010, et Veuillez excuser ma question "basse qualité", mais je me sens comme je suis un ou deux niveaux en dessous de l'exercice de tout le monde: - / si quelqu'un pouvait indiquer comment fusionner ces fichiers DDL dans mon EXE dans un guide étape par étape, ce serait vraiment génial!
13 réponses
For. NET Framework 4.5
ILMerge.exe /target:winexe /targetplatform:"v4,C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /out:finish.exe insert1.exe insert2.dll
- ouvrez CMD et cd dans votre répertoire. Disons:
cd C:\test
- insérer le code ci-dessus.
-
/out:finish.exe
remplacerfinish.exe
par n'importe quel nom de fichier que vous voulez. - Derrière le
/out:finish.exe
vous devez donner les fichiers que vous voulez être combiné.
Download ilmerge and ilmerre gui . fait de joindre les fichiers si facile ive a utilisé ces et fonctionne très bien
Référence à la Dll de vos Ressources et de l'utilisation de la AssemblyResolve-Événement pour revenir à la Ressource-DLL.
public partial class App : Application
{
public App()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
Assembly thisAssembly = Assembly.GetExecutingAssembly();
//Get the Name of the AssemblyFile
var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
//Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
if (resources.Count() > 0)
{
var resourceName = resources.First();
using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
{
if (stream == null) return null;
var block = new byte[stream.Length];
stream.Read(block, 0, block.Length);
return Assembly.Load(block);
}
}
return null;
};
}
}
Utiliser Costura.Fody .
vous avez juste à installer le nuget et puis faire un build . L'exécutable final sera autonome .
-
Installer ILMerge comme les autres fils vous disent à
-
puis allez dans le dossier d'installation, par défaut
C:\Program Files (x86)\Microsoft\ILMerge
-
faites glisser votre Dll et Exes vers ce dossier
-
Shift-Rightcliquez dans ce dossier et choisissez l'invite de commande ouverte
-
écrire
ilmerge myExe.exe Dll1.dll /out:merged.exe
notez que vous devez d'abord écrire votre exe.
voilà ton ex fusionné. Cela pourrait ne pas être la meilleure façon si vous allez à le faire plusieurs fois, mais le plus simple pour une fois, je voudrais recommandez de mettre Ilmerge sur votre chemin.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
/* PUT THIS LINE IN YOUR CLASS PROGRAM MAIN() */
AppDomain.CurrentDomain.AssemblyResolve += (sender, arg) => { if (arg.Name.StartsWith("YOURDLL")) return Assembly.Load(Properties.Resources.YOURDLL); return null; };
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
ajoutez D'abord les DLLs à votre projet-Ressources. Ajouter un dossier "Ressources"
vous pouvez également utiliser ilmergertool chez codeplex avec interface GUI.
j'ai répondu à une question similaire pour VB.NET
. Il ne devrait toutefois pas être trop difficile à convertir. Vous avez intégré le DLL's
dans votre dossier Ressource
et sur la première utilisation, le
L'événement AppDomain.CurrentDomain.AssemblyResolve
est viré.
si vous voulez le référencer pendant le développement, il suffit d'ajouter une référence normale DLL
à votre projet.
Voici la documentation officielle . Il est également téléchargé automatiquement à l'étape 2.
ci-dessous est une façon très simple de le faire et j'ai construit avec succès mon application en utilisant .NET framework 4.6.1
-
Installer ILMerge package nuget, soit via l'interface graphique ou ligne de commande:
Install-Package ilmerge
-
vérifiez que vous l'avez téléchargé. Maintenant installez (pas sûr de la commande pour cela, mais juste aller à vos paquets nuget): Note: vous n'avez probablement besoin de l'installer que pour une de vos solutions si vous avez plusieurs
-
naviguez vers votre dossier solution et dans le dossier packages vous devriez voir 'ILMerge' avec un exécutable:
\FindMyiPhone-master\FindMyiPhone-master\packages\ILMerge.2.14.1208\tools
-
maintenant voici l'exécutable que vous pouvez copier sur votre
\bin\Debug
(ou où que votre application est construite) et puis en ligne de commande / powershell faire quelque chose comme ci-dessous:ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
vous avez maintenant un nouvel exécutable avec toutes vos bibliothèques en une seule!
NOTE: Si vous essayez de charger un assemblage non-ILOnly, alors
Assembly.Load(block)
ne fonctionnera pas, et une exception sera lancée: plus de détails
j'ai surmonté cela en créant un fichier temporaire, et en utilisant
Assembly.LoadFile(dllFile)
J'ai trouvé la Solution CI-DESSOUS sont les Stpes: -
- Download ILMerge.msi et l'Installer sur votre Machine.
- Ouvrez L'Invite De Commande
- Type cd C:\Program fichiers (x86)\Microsoft\ILMerge Preess entrer
- C:\Program fichiers (x86)\Microsoft\ILMerge>ILMerge.exe / target: winexe / targetplatform: "v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319" entrée /sortie:NewExeName.EXE SourceExeName.exe DllName.dll
Pour Dll Multiple :-
C:\Program fichiers (x86)\Microsoft\ILMerge>ILMerge.exe / target: winexe / targetplatform: "v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319" entrée /sortie:NewExeName.exe SourceExeName.exe DllName1.dll DllName2.dll DllName3.dll
la commande doit être le script suivant:
ilmerge myExe.exe Dll1.dll /target:winexe /targetplatform:"v4,c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\" /out:merged.exe /out:merged.exe