2010-01-05 9 views
7

Tengo un proyecto de biblioteca de clase que hice. Llamémoslo ClassA. En ClassA, necesito acceder a algunas herramientas que residen en dll (ToolsDLL.dll).¿Puedes agrupar dlls juntos?

En ClassA He agregado ToolsDLL.dll al proyecto y he seleccionado el archivo ToolsDLL.dll para copiar al directorio de salida SIEMPRE. Entonces esa biblioteca compila y compila muy bien y en el directorio de salida veo ClassA.dll junto con ToolsDLL.dll

A continuación, deseo escribir una aplicación, digamos App_A que usa los métodos en ClassA. Entonces, en mi proyecto App_A, agregué una referencia a ClassA.dll para poder acceder a su espacio de nombres. Todo está bien y bien, construye/compila.

El problema es que tan pronto como ejecuto App_A y llega a un punto donde se necesita usar ToolsDLL.dll arroja una excepción "No se puede cargar ToolsDLL.dll. No entiendo cómo es posible que no puede encontrar esa DLL porque está en el mismo directorio que ClassA.dll.

Descubrí que si pongo ToolsDLL.dll en el directorio de salida de App_A funciona bien. ¿Hay alguna forma de evitarlo? de alguna forma, ToolsDll.dll puede ser incluido de alguna manera con ClassA.dll. La razón es que mis clientes escribirán sus propias aplicaciones similares a AppA y sería bueno si solo tuvieran que hacer referencia a un archivo en su proyecto y no a múltiples

Respuesta

12

Hay una herramienta de Microsoft llamada ILMerge. Probablemente haga lo que quiera, agrupando varios ensambles en un solo archivo.

P.S.: ¿Otra solución bastante utilizada con frecuencia para su problema sería agregar un evento posterior a la construcción a la solución/proyecto de su aplicación que copia el ToolsDLL.dll requerido en el directorio de salida? Algo a lo largo de la línea:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll 

(. Lo siento si me sale algo de él mal, yo estoy escribiendo esto desde mi memoria)

Por supuesto, el cliente también tendría que hacer esto. Pero, de nuevo, es probable que hayan hecho esto antes.

+0

Parece que ILMerge solo se puede usar en conjuntos .Net. Es eso correcto. En mi caso, ToolsDLL.dll me lo proporcionó un fabricante de chips. No sé si es un ensamblado .net o no. ¿Eso importa? – PICyourBrain

+0

Sí, creo que solo funciona para ensamblajes .NET. Para averiguar qué tipo de '.dll' tienes, quizás puedas usar el.Utilidad NET SDK 'ildasm', para intentar y desmontar el' .dll'. Si se trata de un ensamblado .NET, esto debería funcionar; si contiene código nativo, 'ildasm' debería fallar. – stakx

+0

Me di cuenta en Visual Studio si voy a ToolsDll.dll -> Propiedades hay una propiedad llamada Acción. ¿Puedo simplemente configurar esto como Recurso Integrado? – PICyourBrain

1

¿Ha agregado la DLL al proyecto o realmente ha agregado una referencia a la misma? Deberías hacer esto último, entonces este tipo de cosas se solucionan automáticamente para ti. Parece que ha agregado el archivo real a los archivos del proyecto y lo configuró para copiar.

Si desea definitivamente un enfoque único archivo, y luego aceptar las sugerencias de los otros de ILMerge obviamente ...

0

También se puede usar una herramienta de fusión IL, o instalar ToolsDLL.dll en la GAC.

Además, si observa el resultado de App_A, ClassA.dll ya está allí, ahí es donde está buscando ToolsDLL.dll.