Incrustar archivos DLL en un ejecutable compilado

Resuelto Merus asked hace 15 años • 18 respuestas

¿Es posible incrustar una DLL preexistente en un ejecutable compilado de C# (para que solo tenga un archivo para distribuir)? Si es posible, ¿cómo se haría?

Normalmente, estoy bien con dejar las DLL afuera y que el programa de instalación se encargue de todo, pero ha habido un par de personas en el trabajo que me han preguntado esto y, sinceramente, no lo sé.

Merus avatar Oct 10 '08 06:10 Merus
Aceptado

Recomiendo encarecidamente utilizar Costura.Fody , con diferencia la mejor y más sencilla forma de incorporar recursos en su ensamblaje. Está disponible como paquete NuGet.

Install-Package Costura.Fody

Después de agregarlo al proyecto, automáticamente incrustará todas las referencias que se copian en el directorio de salida en su ensamblado principal . Es posible que desees limpiar los archivos incrustados agregando un destino a tu proyecto:

Install-CleanReferencesTarget

También podrá especificar si desea incluir los pdb, excluir ciertos ensamblajes o extraer los ensamblajes sobre la marcha. Hasta donde yo sé, también se admiten ensamblajes no administrados.

Actualizar

Actualmente, algunas personas están intentando agregar soporte para DNX .

Actualización 2

Para la última versión de Fody, necesitará tener MSBuild 16 (es decir, Visual Studio 2019). La versión 4.2.1 de Fody funcionará con MSBuild 15. (referencia: Fody solo es compatible con MSBuild 16 y superior. Versión actual: 15 )

Matthias avatar Nov 30 '2013 21:11 Matthias

Simplemente haga clic derecho en su proyecto en Visual Studio, elija Propiedades del proyecto -> Recursos -> Agregar recurso -> Agregar archivo existente... E incluya el siguiente código en su App.xaml.cs o equivalente.

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");

    dllName = dllName.Replace(".", "_");

    if (dllName.EndsWith("_resources")) return null;

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

    byte[] bytes = (byte[])rm.GetObject(dllName);

    return System.Reflection.Assembly.Load(bytes);
}

Aquí está mi publicación de blog original: http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/

Lars Holm Jensen avatar Jun 15 '2011 18:06 Lars Holm Jensen