Pregunta

Tengo una solución con múltiples proyectos.Estoy intentando optimizar los archivos AssemblyInfo.cs vinculando un archivo de información de ensamblaje de toda la solución.¿Cuáles son las mejores prácticas para hacer esto?¿Qué atributos deben estar en el archivo de toda la solución y cuáles son específicos del proyecto/ensamblaje?


Editar:Si está interesado, hay una pregunta de seguimiento. ¿Cuáles son las diferencias entre AssemblyVersion, AssemblyFileVersion y AssemblyInformationalVersion?

¿Fue útil?

Solución

Estamos usando un archivo global llamado GlobalAssemblyInfo.cs y uno local llamado AssemblyInfo.cs.El archivo global contiene los siguientes atributos:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

El archivo AssemblyInfo.cs local contiene los siguientes atributos:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Puede agregar GlobalAssemblyInfo.cs mediante el siguiente procedimiento:

  • Seleccionar Agregar/Artículo existente... en el menú contextual del proyecto
  • Seleccione GlobalAssemblyInfo.cs
  • Expanda el botón Agregar haciendo clic en esa pequeña flecha hacia abajo en la mano derecha
  • Seleccione "Agregar como enlace" en la lista desplegable de botones.

Otros consejos

En mi caso, estamos construyendo un producto para el cual tenemos una solución Visual Studio, con varios componentes en sus propios proyectos.Se van los atributos comunes.En la solución, hay alrededor de 35 proyectos y una información de ensamblaje común (CommonAssemblyInfo.cs), que tiene los siguientes atributos:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Los demás atributos, como Título de ensamblaje, Versión de ensamblaje, etc., los proporcionamos por ensamblaje.Al crear un ensamblaje, tanto AssemblyInfo.cs como CommonAssemblyInfo.cs se integran en cada ensamblaje.Esto nos brinda lo mejor de ambos mundos, donde es posible que desee tener algunos atributos comunes para todos los proyectos y valores específicos para algunos otros.

Espero que ayude.

La solución presentada por @JRoppert es casi la misma que hago yo.La única diferencia es que puse las siguientes líneas en el archivo local AssemblyInfo.cs, ya que pueden variar con cada ensamblaje:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

También uso (generalmente) una información de ensamblaje común por solución, asumiendo que una solución es una única línea de producto/producto lanzable.El archivo de información de ensamblaje común también tiene:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Lo que establecerá el valor "ProductVersion" que muestra el Explorador de Windows.

Tareas de la comunidad de MSBuild contiene una tarea personalizada llamada AssemblyInfo que puede utilizar para generar su asambleainfo.cs.Requiere un poco de edición manual de sus archivos csproj para usarlo, pero vale la pena.

En mi opinión, usar GlobalAssemblyInfo.cs es más problemático de lo que vale, porque necesita modificar cada archivo de proyecto y recordar modificar cada proyecto nuevo, mientras que obtiene un AssemblyInfo.cs de forma predeterminada.

Para cambios en los valores globales (es decir,Empresa, Producto, etc.) los cambios suelen ser tan poco frecuentes y sencillos de gestionar, no creo SECO debería ser una consideración.Simplemente ejecute el siguiente script de MSBuild (dependiendo del Paquete de extensión de MSBuild) cuando desee cambiar manualmente los valores en todos los proyectos como una sola vez:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

Para compartir un archivo entre varios proyectos, puede agregar un archivo existente como enlace.

Para hacer esto, agregue un archivo existente y haga clic en "Agregar como enlace" en el selector de archivos.Add As Link
(fuente: gratis.fr)

En cuanto a qué poner en el archivo compartido, sugeriría poner cosas que se compartirían entre ensamblajes.Cosas como derechos de autor, empresa, quizás versión.

No se recomienda utilizar un único archivo AseemblyInfo.cs para varios proyectos.El archivo AssemblyInfo incluye información que puede ser relevante solo para ese ensamblaje específico.Los dos datos más obvios son los AssemblyTitle y AssemblyVersion.

Una mejor solución podría ser utilizar targets , que son manejados por MSBuild, para "inyectar" atributos de ensamblaje a más de un proyecto.

Una cosa que he encontrado útil es generar los elementos AssemblyVersion (etc.) aplicando la sustitución de tokens en la fase previa a la compilación.

Yo uso TortoiseSvn y es fácil de usar. SubWCRev.exe girar una plantilla AssemblyInfo.wcrev en AssemblyInfo.cs.La línea relevante en la plantilla podría verse así:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

El tercer elemento es entonces el número de revisión.Utilizo el cuarto elemento para comprobar que no me he olvidado de enviar ningún archivo nuevo o modificado (el cuarto elemento es 00 si todo está bien).

Por cierto, agrega AssemblyInfo.wcrev a su control de versiones y ignorar AssemblyInfo.cs si usas esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top