2008-09-02 16 views
16

Estoy trabajando en un módulo para un CMS. Este módulo se distribuye como una biblioteca de clase DLL.Vinculación estática en C#

Tengo varias bibliotecas de utilidades que me gustaría usar en este módulo. ¿Hay alguna forma en que pueda vincular estas bibliotecas de forma estática para no tener que distribuir varias DLL (distribuyendo así mis bibliotecas de utilidades por separado)?

Me gustaría tener una sola DLL.

Respuesta

23

Puede combinar sus muchos archivos DLL con ILMerge:

http://research.microsoft.com/~mbarnett/ILMerge.aspx

no lo he probado a mí mismo. Espero eso ayude.


Descargar aquí:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

Breve descripción(de descarga páginas)
ILMerge es una utilidad para la fusión de varias NET en un ensamblado de .NET sola. Funciona tanto en ejecutables como en archivos DLL y viene con varias opciones para controlar el procesamiento y el formato de la salida. Consulte la documentación adjunta para más detalles.

+1

Como mencionó Seb ILMERGE hará esto, pero una advertencia es que ninguno de los ensamblajes puede contener código inseguro. –

+5

El código inseguro está bien. No tratará con conjuntos de modo mixto. El tipo que contiene código no administrado y fue creado por un proyecto de C++/CLI. –

2

¡La respuesta corta para esto es no! No se puede vincular en un dll durante la compilación. No sé si hay alguna forma sutil de hacerlo, pero probablemente tendrías que distribuir los dlls junto con tu cms. La mejor manera de hacerlo es hacer algún tipo de redistribución.

+0

No es cierto. Mire la respuesta de Kagamar. También mire la sección de comentarios para el comentario de Mike Barnett. – Kobor42

+2

@ Kobor42: Incorrecto, esto no es vincular esto se está fusionando. Mientras que la respuesta más votada responde a la intención de la pregunta (y por lo tanto es la respuesta más útil), la respuesta de khebbie es la correcta, siempre y cuando uno responda con precisión la pregunta formulada. Ni siquiera puedes vincular un dll en C/C++, necesitas un archivo estático para hacerlo ... –

+0

Es gracioso que esta respuesta, que es técnicamente correcta, no tenga votos ascendentes. C# es un lenguaje administrado, e incluso ILMerge es una fusión de ensamblaje, no un enlazador. Un enlazador, tal como lo entienden los desarrolladores de C++ y C, no puede existir actualmente en .NET tal como existe actualmente. Sin embargo, una tecnología ".Net nativa" aún no lanzada a mediados de 2015, puede salir algún día que permita una aplicación completamente compilada (ya no MSIL), que luego podría estar enlazada estáticamente. –

12

Si no desea utilizar ILMerge, consulte esta página:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

del editor de notas: consejos Jeffrey Richter para poner sus archivos DLL en el archivo exe como recursos (Para cada archivo DLL agrega, muestra sus propiedades y cambia su "Acción de compilación" a "Recurso incrustado"). Entonces se necesita un cargador de clases personalizado para hacer que el ejecutable funcione (En tiempo de ejecución, el CLR no podrá encontrar los ensamblados DLL dependientes, lo que es un problema. Para solucionar esto, cuando la aplicación se inicialice, registre un método de devolución de llamada con el evento ResolveAssembly de AppDomain).

Asegúrese de cambiar la cadena resourceName para que apunte a sus recursos reales. (por ejemplo, cambie AssemblyLoadingAndReflection al nombre de su proyecto.)

+1

Mucho mejor! Solución de Nativ sobre herramienta de terceros. Mire la sección de comentarios para ver el comentario del creador de ILMerge ... – Kobor42

+2

Si bien esto requiere un pequeño esfuerzo adicional, esta parece ser la mejor solución que la aceptada. – CubicleSoft

Cuestiones relacionadas