2008-10-16 22 views
9

En Visual Studio 2008 (y otros) al crear una aplicación .NET o Silverlight si mira las propiedades de su proyecto, parece que solo puede tener un nombre de ensamblado, en todas las configuraciones. Me gustaría compilar mi aplicación como:¿Cómo usar un nombre de conjunto diferente para diferentes configuraciones?

MyAppDebug - en modo de depuración y justo MiApl - en modo de lanzamiento

¿alguien sabe si esto es posible?

Editar:

Parece que algunas personas están cuestionando el razonamiento detrás de la pregunta, así que voy a explicar un poco más lejos:

Estoy trabajando en una aplicación de Silverlight que obtiene carga automáticamente en nuestro sitio de prueba cuando estoy en una "solución de compilación". El problema es que el equipo de prueba ahora está probando la versión en línea, mientras yo trabajo en una nueva. Entonces, quiero tener una url como. \ MyApp.html para la versión regular que el equipo de QA probará y luego. \ MyApp.html? Version = depurar para la versión actual en la que estoy trabajando.

Respuesta

1

he logrado conseguir lo que buscaba mediante un script posterior a la generación:

if "$(ConfigurationName)"=="Debug" goto debug 
"$(SolutionDir)ftp.bat" "$(TargetDir)$(TargetName).xap" 
:debug 
"$(SolutionDir)ftp.bat" "$(TargetDir)$(TargetName).xap" "$(TargetDir)$(TargetName)Debug.xap" 

Mi script ftp básicamente acepta un parámetro opcional al final, que es lo que para cargar el archivo. Por lo tanto, en mi máquina local, los nombres de los archivos son siempre los mismos, pero en el modo de depuración lo cargamos con "Debug" al final del nombre del archivo. Ahora puedo elegir en mi página web qué versión mostrar.

+1

¿Por qué no usar diferentes carpetas en su lugar? – mbx

3

Claro que puede agregar un evento de construcción posterior para cambiar el nombre del ensamblaje. Esto funcionará si su solución tiene solo un ensamblaje.

Pero si su solución consiste en varios proyectos, normalmente tiene un proyecto que hace referencia al conjunto generado por otro problema. Imagine que su solución tiene dos proyectos: el primero crea un exe de Windows Forms (MyApp.EXE), que hace referencia al ensamblado creado por el segundo proyecto (MyData.DLL).

En este ejemplo, el archivo EXE de depuración se llamaría MyAppDebug.EXE, y debe hacer referencia a MyDataDebug.EXE. Y esto no funcionará con el cambio de nombre en un evento posterior a la construcción.

Por lo tanto, recomiendo encarecidamente no realizar ningún cambio de nombre.

+2

Hay otro problema con el cambio de nombre posterior a la creación: se pierde gran parte de la integración del depurador. Básicamente debe ejecutar el programa usted mismo y luego adjuntar el depurador. –

2

Si a pesar de todo tiene su corazón puesto en hacer esto, entonces se podría hacer algo como esto en su archivo AssemblyInfo.cs:

#if DEBUG 
[assembly: AssemblyTitle("MyAssemblyDebug")] 
#else 
[assembly: AssemblyTitle("MyAssembly")] 
#endif 

Sin embargo, esto es más o menos un hack. Además, la documentación de MSDN es bastante clara: ni siquiera se considera el nombre del archivo al cargar un ensamblaje, por lo que un simple cambio de nombre no cambiará la identidad general de su ensamblaje.

Como se mencionó anteriormente, esto va a ser una mala idea, ya que solo generará confusión y problemas de mantenimiento. Si todo lo que hacemos es cambiar el nombre de los archivos haciendo una operación de post construcción:

renombrar "$ (ProjectDir) bin \ Debug \ SomeAssembly.dll" SomeAssemblyDebug.dll

Entonces paraíso' Realmente cambió la identidad de su ensamblaje solo el nombre del archivo. Podría llamarlo Bob.dll y aún tendrá la misma identidad en lo que respecta al CLR. El único momento en que esto importa es cuando está utilizando un ensamblado con un nombre fuerte que se implementará en el GAC. En ese caso, usted no puede tener un nombre de archivo diferente del nombre del ensamblado.

Si realmente está tratando de cambiar el nombre del ensamblado, y no solo el nombre de archivo, entonces tiene otro problema en su mano porque ahora es un ensamblaje totalmente diferente al CLR.

Creo que es mejor vivir con los estándares que ya existen. Si te encuentras teniendo que hacer algo realmente extraño quizás deberías preguntarte por qué estás tratando de hacer esto. Puede haber una mejor solución.

10

Lo he hecho al jugar con el archivo .csproj: mueva el atributo a los grupos de propiedades específicas de la configuración o simplemente use la condición. Ejemplo:

<AssemblyName>MyApp</AssemblyName> 
<AssemblyName Condition=" '$(Configuration)' == 'Debug' ">MyAppDebug</AssemblyName> 

Visual Studio se convierte en algo inválido cuando se empieza a jugar con .csproj como éste - por ejemplo, ya no puedo F5/F10 para ejecutar el proyecto en modo de depuración; me dice que "MyApp.exe" no se encontró (es decir, el depurador intenta iniciar el ensamblado con un AssemblyName incorrecto).

+1

No comprobado, pero creo que sus problemas de depuración pueden desaparecer si hace que la 1ra línea sea el condicional opuesto de la segunda línea. Visual Studio probablemente deja de analizar un AssemblyName cuando encuentra el primero que funciona. –

+1

He probado la hipótesis de CAD bloke y es exactamente correcta. Cambiar el orden (o más en general, poner primero los enunciados condicionales) corregirá el error 'MyApp.exe' no encontrado. Una vez que Visual Studio encuentra un AssemblyName válido, ignora los que vienen después. – eskimwier

Cuestiones relacionadas