2010-06-17 11 views
8

Resumen¿Cómo depuro en un ensamblado ILMerged?

quiero alterar el proceso de construcción de una solución de 2-ensamblaje, de manera que una llamada a ILMerge se invoca, y los resultados se basan en un solo conjunto. Además, me gustaría poder depurar en el conjunto resultante.

Preparación - Un ejemplo sencillo

  1. nueva solución - ClassLibrary1
  2. Crear una función estática 'GetMessage' en la Clase 1 que devuelve la cadena "Hola mundo"
  3. Crear nueva aplicación de consola, que las referencias la ClassLibrary.
  4. Imprime GetMessage desde main() a través de la consola.

Ahora tiene una aplicación de montaje 2 que da salida a "Hello World" en la consola.

¿Qué sigue ...?

me gustaría alterar el proceso de aplicación de construcción de la consola, para incluir una etapa de post construcción que utiliza ILMerge, para combinar el conjunto de ClassLibrary en el montaje de la consola

Después de esta etapa I debe ser capaz de:

  • ejecutar la aplicación de consola directamente sin ClassLibrary1.dll presente
  • ejecutar la aplicación de consola a través de F5 (o F11) en VS y ser capaz de depurar en cada uno de los 2 proyectos.

Limited éxito

leí this blogpost y logró alcanzar la fusión que fue después con una orden posterior a la generación de ...

"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName) 

... y un ILMerge. archivo del murciélago que leyó ...

CD %1 
Copy %2.exe temp.exe 
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll 
Del temp.exe 
Del ClassLibrary1.* 

Esto funciona bastante bien, y de hecho pro duce un exe que se ejecuta fuera del entorno VS según sea necesario. Sin embargo, no parece producir símbolos (archivo .pdb) que VS pueda usar para depurar en el código.

Creo que esta es la última pieza del rompecabezas.

¿Alguien sabe cómo puedo hacer que esto funcione?

FWIW Estoy ejecutando VS2010 en una x64 Win7 x64 máquina.

Actualización: ¿Por qué quiero hacer esto?

Se ha preguntado: '¿Realmente necesito ILMerge durante el escenario de depuración?'

Las asambleas de mi solución tendrá que coexistir en la misma carpeta que los de otras soluciones (algunas de las cuales es probable que desarrollar)

Algunas de estas soluciones compartirán dependencias en diferentes versiones de algunos montajes.

Así Solution1 podría estar compuesto por Console1 y ClassLibrary1.dll (v1) y Solution2 podría estar compuesto por Console2 y Classlibrary1.dll (v2).

En lugar de registrar todo en el GAC, pensé que podría ILMerge la versión correcta de una dependencia en el ensamblaje principal de la solución para evitar una colisión.

Sin embargo, esto hace que actualmente sea imposible depurar la solución, lo que tengo que hacer en conjunto con las otras soluciones que estarán presentes.

¿Suena complicado? Eso es porque es ..: D

+0

En lugar de tener un script .bat, una cosa que podría hacer es crear un tercer proyecto (tipo ClassLibrary funcionará) cuyas dependencias son ConsoleApp y ClassLibrary; llámalo PostSolutionBuildEvents.Luego haga que su postcompilación sea un comando ILMerge. De esta forma, obtienes acceso a todas las macros como '$ (SolutionDir)'. –

+1

Nota: No debe necesitar las funciones de GAC para este fin, hay una gran cantidad de opciones que van desde "simplemente funciona" cuando nada es GACd hasta los archivos de configuración de la aplicación –

+1

¿alguna vez resolvió esto? el mismo problema aquí ... –

Respuesta

1

Sugeriría que solo ILMerge libere compilaciones de sus ensamblajes. No puedo imaginar ningún beneficio que obtendría de la fusión de ensamblados de depuración.

+0

He agregado a mi pregunta original explicando (tipo de) por qué me gustaría hacer esto. –

+0

En cuanto a su actualización, creo que está causando más problemas, entonces está resolviendo tratando de seguir esta ruta. Comience una nueva pregunta usando su actualización como pregunta: definitivamente hay una mejor solución que el enfoque que está intentando. –

+0

No estoy seguro de entender ... ¿Qué estás sugiriendo que pregunte? –

-1

No creo que ILMerge pueda hacerlo. OTOH smartassembly de red-gate (no gratis) puede hacerlo, al menos lo dice en features

Y sí, estoy de acuerdo con Mike para utilizar ILMerge solo para versiones de lanzamiento.

4

Lamentamos que tenga problemas. No seguí tus pasos exactos, pero creé una aplicación de consola, A.exe, que llamaba a un método en un dll, B.dll. Construí ambos ensamblajes en modo Debug (para que tuvieran archivos PDB). Entonces les fusionó así:

ILMerge /out:foo.exe a.exe B.dll

(En realidad A y B estaban en otro directorio por lo que mi línea de comandos era un poco más complicado , pero eso no debería marcar la diferencia.) Después de completar ILMerge, había dos archivos en el directorio actual: foo.exe y foo.pdb. Entonces escribí:

devenv foo.exe

Esto abrió Visual Studio y luego me golpeó "F10" para iniciar el depurador. Pude ingresar al método Main en el ejecutable y luego usé "F11" para ingresar al método en el que originalmente había estado en B.dll. La experiencia de depuración fue exactamente la misma que en la solución original de Visual Studio con los dos ensamblajes.

Si todavía tiene problemas, no dude en poner toda su solución en un archivo zip y enviarlo a mí (mbarnett en Microsoft punto com) y puedo probarlo.

+1

+1 por una respuesta del autor de ILMerge El archivo .pdb resultante funciona bien para mí, si está en el mismo directorio que el ensamblado fusionado (exe en mi caso). Ver preguntas/respuestas similares http://stackoverflow.com/questions/1439721/is-there-a-way-to-merge-pdb-files-with-ilmerge – joelsand

+0

Funcionó porque no cambió el nombre de las cosas (ver mi respuesta) . –

0

Intenté hacer algo como esto y encontré que no debe cambiar el nombre, tampoco antes después de la fusión. Mover cosas para separar el directorio está bien. Si no cambia el nombre, funciona.

Cuestiones relacionadas