c# - Fusionar DLL en EXE?
merge ilmerge (13)
Tengo dos archivos DLL que me gustaría incluir en mi archivo EXE para que sea más fácil distribuirlo. He leído un poco aquí y allá cómo hacer esto, incluso encontré un buen hilo here , y here , pero es demasiado complicado para mí y necesito instrucciones básicas reales sobre cómo hacer esto.
Estoy usando Microsoft Visual C # Express 2010, y disculpe mi pregunta de "bajo nivel", pero me siento como si estuviera uno o dos niveles por debajo del experimento de todos: - / Si alguien pudiera señalar cómo fusionar estos archivos DDL en mi EXE en una guía paso a paso, ¡esto sería realmente increíble!
ILMerge como los otros hilos te dicen
A continuación, vaya a la carpeta de instalación, de forma predeterminada
C:/Program Files (x86)/Microsoft/ILMerge
Arrastre su Dll y Exes a esa carpeta
Shift-Right haga clic en esa carpeta y elija abrir símbolo del sistema
Escribir
ilmerge myExe.exe Dll1.dll /out:merged.exe
Tenga en cuenta que primero debe escribir su exe.
Ahí tienes tu exe fusionado. Esta podría no ser la mejor manera si vas a hacer esto varias veces, pero la más simple para un uso único, te recomendaría poner a Ilmerge en tu camino.
Aquí está la documentación oficial . Esto también se descarga automáticamente en el paso 2.
A continuación se muestra una forma muy simple de hacerlo y he creado mi aplicación con éxito usando .NET framework 4.6.1
Instale el paquete nuget de ILMerge ya sea a través de la interfaz gráfica de usuario o la línea de comando:
Install-Package ilmerge
Verifique que lo haya descargado. Ahora instala (no estoy seguro del comando para esto, solo ve a tus paquetes nuget): Nota: Probablemente solo necesite instalarlo para una de sus soluciones si tiene múltiples
Navega a la carpeta de la solución y en la carpeta de paquetes deberías ver ''ILMerge'' con un ejecutable:
/FindMyiPhone-master/FindMyiPhone-master/packages/ILMerge.2.14.1208/tools
Ahora aquí está el ejecutable que puede copiar en su
/bin/Debug
(o donde esté construida su aplicación) y luego en commandline / powershell haga algo como a continuación:ILMerge.exe myExecutable.exe myDll1.dll myDll2.dll myDlln.dll myNEWExecutable.exe
¡Ahora tendrá un nuevo ejecutable con todas sus bibliotecas en uno!
Descarga ilmerge e ilmergre gui . hace que unir los archivos sea tan fácil, los he usado y funciona muy bien
El comando debe ser el siguiente script:
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
Haga referencia a las DLL a sus recursos y use AssemblyResolve-Event para devolver la DLL de recursos.
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;
};
}
}
NOTA: si intenta cargar un ensamblado que no sea de ILOnly, entonces
Assembly.Load(block)
no funcionará, y se lanzará una excepción: más detalles
Superé esto creando un archivo temporal y usando
Assembly.LoadFile(dllFile)
Para .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
- Abra CMD y cd en su directorio. Digamos:
cd C:/test
- Inserta el código de arriba.
-
/out:finish.exe
reemplacefinish.exe
con cualquier nombre de archivo que desee. - Detrás de
/out:finish.exe
tiene que dar los archivos que desea combinar.
Respondí una pregunta similar para VB.NET
. Sin embargo, no debería ser demasiado difícil de convertir. Incrustas las DLL''s
en tu carpeta de Ressource
y en el primer uso, el evento AppDomain.CurrentDomain.AssemblyResolve
se desencadena.
Si desea referenciarlo durante el desarrollo, simplemente agregue una referencia DLL
normal a su proyecto.
Incrustar una DLL en un proyecto
También puede usar ilmergertool en codeplex con interfaz GUI.
Usa Costura.Fody .
Solo tienes que instalar el nuget y luego hacer una compilación . El ejecutable final será independiente .
Encontré la solución a continuación son los Stpes: -
- Descargue ILMerge.msi e instálelo en su máquina.
- Abrir símbolo del comando
- escriba cd C: / Archivos de programa (x86) / Microsoft / ILMerge Preess Enter
- C: / Archivos de programa (x86) / Microsoft / ILMerge> ILMerge.exe / destino: winexe /targetplatform:"v4,C:/Windows/Microsoft.NET/Framework/v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName.dll
Para Dll Múltiple: -
C: / Archivos de programa (x86) / Microsoft / ILMerge> ILMerge.exe / destino: winexe /targetplatform:"v4,C:/Windows/Microsoft.NET/Framework/v4.0.30319 "/out:NewExeName.exe SourceExeName.exe DllName1.dll DllName2.dll DllName3.dll
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());
}
}
Primero agregue las DLL a su proyecto-Recursos. Agregar una carpeta "Recursos"