Equivalente a AssemblyInfo en dotnet core / csproj

236

Dado que dotnet core regresó al .csprojformato, hay un nuevo autogenerado MyProject.AssemblyInfo.csque contiene entre otros.

[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]

Tenga en cuenta que esto se regenera automáticamente cada compilación. Anteriormente, el archivo se encontraba en el directorio / obj /, ahora parece estar solo en la memoria ya que el archivo no se puede encontrar en el disco y al hacer clic en el mensaje de error no se abre ningún archivo.

Este es el mensaje de error: ingrese la descripción de la imagen aquí

Como están definidos allí, no puedo definirlos yo mismo en el clásico AssemblyInfo.cs.

¿Dónde / cómo puedo definir la Compañía y la Versión de un proyecto?

hultqvist
fuente
55
Tenga en cuenta que esto no está estrictamente relacionado con el núcleo dotnet. Esto está bastante relacionado con el nuevo formato basado en .csproj. Está perfectamente bien usar este nuevo formato .csproj para apuntar al antiguo .NET Framework, por ejemplo net461
Jim Aho

Respuestas:

334

Como ya has notado, puedes controlar la mayoría de estas configuraciones en .csproj.

Si prefiere mantenerlos en AssemblyInfo.cs, puede desactivar los atributos de ensamblaje generados automáticamente.

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

Si desea ver lo que sucede debajo del capó, consulte Microsoft.NET.GenerateAssemblyInfo.targets dentro de Microsoft.NET.Sdk.

natemcmaster
fuente
41
Me alegra ver que puedo apagar esto. Llámame anticuado, pero prefiero el viejo archivo AssemblyInfo.cs que el material autogenerado de .netcore. Además, utilizo herramientas externas para administrar mis versiones y el contenido de las otras entradas de AssembyInfo. Traté de usar un objetivo personalizado para mantener mis propiedades fuera del proyecto en sí, pero me atragantó por un tiempo.
Ivaylo Slavov
1
Igual que aquí. Con el nuevo sistema basado en csproj, no pude usar mis herramientas heredadas. Con esta propiedad, ahora puedo volver, ¡lo cual me encanta!
Estructurado el
55
NuGet no lee AssemblyInfo.cs. Aún debe usar las propiedades de MSBuild para definir la versión del paquete NuGet.
natemcmaster
66
cuando el archivo se genera automáticamente, ¿cómo configurar el atributo InternalsVisibleTo en el nuevo formato csproj?
Shubhan
8
@Shubhan este no es uno de los atributos autogenerados. Cree un archivo .cs vacío en algún lugar de su proyecto y agregue el código InternalsVisibleTo
natemcmaster
128

Esa configuración se ha movido al archivo .csproj.

De forma predeterminada, no se muestran, pero puede descubrirlos desde Visual Studio 2017 en la Packagepestaña de propiedades del proyecto .

Propiedades del proyecto, pestaña Paquete

Una vez guardados, esos valores se pueden encontrar en MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <Version>1.2.3.4</Version>
    <Authors>Author 1</Authors>
    <Company>Company XYZ</Company>
    <Product>Product 2</Product>
    <PackageId>MyApp</PackageId>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Description>Description here</Description>
    <Copyright>Copyright</Copyright>
    <PackageLicenseUrl>License URL</PackageLicenseUrl>
    <PackageProjectUrl>Project URL</PackageProjectUrl>
    <PackageIconUrl>Icon URL</PackageIconUrl>
    <RepositoryUrl>Repo URL</RepositoryUrl>
    <RepositoryType>Repo type</RepositoryType>
    <PackageTags>Tags</PackageTags>
    <PackageReleaseNotes>Release</PackageReleaseNotes>
  </PropertyGroup>

En la pestaña de información de propiedades del explorador de archivos, FileVersionse muestra como "Versión del archivo" y Versionse muestra como "Versión del producto"

hultqvist
fuente
1
La configuración en las propiedades del proyecto parece faltar si mi tipo de proyecto es Class Library (.NET Standard). ¿Tienes alguna idea de por qué? Estoy usando la versión 15.1, versión 26403.7, edición comunitaria.
ventiseis
2
Estoy usando Class Library (.NET Standard) y lo veo en la pestaña Paquetes. ¿Lo ves ahí? Una vez que "Guarde" algo distinto de los valores predeterminados, aparecerá en el csproj.
tofutim
3
¿Cómo se usa un comodín como 1.0. *. * Cuando se usa la pestaña de paquetes?
Soenhay
@Soenhay, el comodín no tiene mucho sentido al definir la versión del paquete, solo cuando se consume.
Paul Hatcher
@Soenhay, entiendo que no puede hacerlo a menos que use una función similar en herramientas de terceros.
hultqvist 01 de
115

Hago lo siguiente para mis proyectos .NET Standard 2.0.

Cree un Directory.Build.propsarchivo (por ejemplo, en la raíz de su repositorio) y mueva las propiedades que se compartirán del .csprojarchivo a este archivo.

MSBuild lo recogerá automáticamente y los aplicará a los generados automáticamente AssemblyInfo.cs.

También se aplican al paquete nuget al compilar uno con dotnet packo a través de la interfaz de usuario en Visual Studio 2017.

Ver https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

pfx
fuente
12
Esto debería obtener más votos positivos, es bueno permitir que se genere automáticamente, pero aún así compartir algunas cosas a través de una solución
Dan
@Dan estuvo de acuerdo, esto está tan por debajo de las otras respuestas que sospecho que la mayoría de la gente simplemente no termina leyendo esto.
Lunyx
1
@Justin, no los verás dentro de los archivos de tu proyecto; se aplican en los ensamblajes construidos resultantes.
pfx
1
¿Qué pasa con aquellos de nosotros que no usamos msbuild?
Joe Phillips
1
Esta fue una gran respuesta. Gracias. Lo usamos en nuestra gran solución que produce algunos paquetes NuGet y esta es una gran alternativa a la información de ensamblaje anterior para nuevos proyectos de estilo SDK
David Anderson,
57

Siempre puede agregar su propio AssemblyInfo.cs , que es útil InternalsVisibleToAttribute, CLSCompliantAttributey otros que no se generan automáticamente.

Agregar AssemblyInfo.cs a un proyecto

  1. En el Explorador de soluciones, haga clic derecho en <project name> > Add > New Folder.

Añadir nueva carpeta

  1. Nombre de la carpeta "Propiedades".

Nombre de la carpeta Propiedades

  1. Haga clic derecho en la carpeta "Propiedades" y haga clic Add > New Item....

Agregar ítem nuevo

  1. Seleccione "Clase" y asígnele el nombre "AssemblyInfo.cs".

Nombre de archivo AssemblyInfo.cs

Supresión de atributos autogenerados

Si desea mover sus atributos nuevamente a AssemblyInfo.cs en lugar de hacer que se generen automáticamente, puede suprimirlos en MSBuild como señaló natemcmaster en su respuesta .

NightOwl888
fuente
1
Gracias NightOwl888, esta es la respuesta que estoy buscando.
Juniuz
3
Evitaría asumir que todos tienen Visual Studio en estos días, hay otros editores que podrían usarse para hacer que esta respuesta sea difícil de seguir para algunos (por ejemplo, estoy haciendo esto en una Mac / Mono usando Jetbrains Rider)
PandaWood
A veces, los nuevos clientes potenciales de Microsoft deberían considerar conservar lo que funciona bien con AssemblyInfo.cs para que las compilaciones automáticas puedan funcionar para modificar los números de compilación.
justdan23
6

Agregando a la respuesta de NightOwl888, puede ir un paso más allá y agregar una AssemblyInfoclase en lugar de solo una clase simple:

ingrese la descripción de la imagen aquí

datchung
fuente
55
No hay un "Archivo de información de ensamblaje" cuando abro este cuadro de diálogo en VS2019 para un proyecto netstandard 1.1.
SwissCoder
¡Gracias por publicar esto! Estoy usando .NET Core 3.1 y estaba justo allí. Agrega todas las partes predeterminadas clave.
justdan23
6

Quiero extender este tema / respuestas con lo siguiente. Como alguien mencionó, este AssemblyInfo generado automáticamente puede ser un obstáculo para las herramientas externas. En mi caso, al usar FinalBuilder , tuve un problema que la información de construcción no estaba actualizando AssemblyInfo . Aparentemente, FinalBuilder se basa en el ~projarchivo para encontrar la ubicación de AssemblyInfo . Pensé, estaba buscando en cualquier lugar debajo de la carpeta del proyecto. No. Entonces, cambiando esto

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

solo realizó la mitad del trabajo, permitió información de ensamblaje personalizado si fue construido por VS IDE / MS Build. Pero necesitaba que FinalBuilder lo hiciera también sin manipulaciones manuales en el archivo de información de ensamblaje. Necesitaba satisfacer todos los programas, MSBuild / VS y FinalBuilder.

Resolví esto agregando una entrada a la existente ItemGroup

<ItemGroup>
   <Compile Remove="Common\**" />
   <Content Remove="Common\**" />
   <EmbeddedResource Remove="Common\**" />
   <None Remove="Common\**" />
   <!-- new added item -->
   <None Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Ahora, teniendo este elemento, FinalBuilder encuentra la ubicación de AssemblyInfo y modifica el archivo. Si bien la acción Nonepermite que MSBuild / DevEnv ignore esta entrada y ya no informe un error basado en la Compileacción que generalmente viene con la entrada de información de ensamblaje en los projarchivos.

C: \ Archivos de programa \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): error: se incluyeron elementos duplicados de 'Compilación'. El SDK de .NET incluye elementos 'Compilar' del directorio de su proyecto de forma predeterminada. Puede eliminar estos elementos de su archivo de proyecto o establecer la propiedad 'EnableDefaultCompileItems' en 'falso' si desea incluirlos explícitamente en su archivo de proyecto. Para obtener más información, consulte https://aka.ms/sdkimplicititems . Los elementos duplicados fueron: 'AssemblyInfo.cs'

TS
fuente