Эквивалент AssemblyInfo в ядре dotnet /csproj

Так как дотнет ядро ​​вернулось к .csproj формат есть новый сгенерированный MyProject.AssemblyInfo.cs которые содержат среди прочего.

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

Обратите внимание, что это автоматически восстанавливается при каждой сборке. Ранее файл был найден в каталоге /obj/, теперь он, похоже, находится только в памяти, так как файл не может быть найден на диске, а нажатие на сообщение об ошибке не открывает файл.

Это сообщение об ошибке:

Так как они определены там, я не могу определить их сам в классическом AssemblyInfo.cs,

Где / как я могу определить компанию и версию проекта?

8 ответов

Решение

Как вы уже заметили, вы можете контролировать большинство этих настроек в.csproj.

Если вы предпочитаете хранить их в AssemblyInfo.cs, вы можете отключить автоматически сгенерированные атрибуты сборки.

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

Если вы хотите увидеть, что происходит под капотом, загляните в Microsoft.NET.GenerateAssemblyInfo.targets внутри Microsoft.NET.Sdk.

Эти настройки перенесены в файл.csproj.

По умолчанию они не отображаются, но вы можете найти их в Visual Studio 2017 в свойствах проекта. Package Вкладка.

Свойства проекта, вкладка Пакет

После сохранения эти значения можно найти в 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>

На вкладке информации о свойствах проводника FileVersion отображается как "Версия файла" и Version отображается как "Версия продукта"

Я делаю следующее для моих проектов.NET Standard 2.0.

Создать Directory.Build.props файл (например, в корне вашего репо) и переместить свойства, которые будут доступны из .csproj файл в этот файл.

MSBuild подберет его автоматически и применяет к автоматически сгенерированным AssemblyInfo.cs,

Они также применяются к пакету nuget при создании dotnet pack или через пользовательский интерфейс в Visual Studio 2017.

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

Вы всегда можете добавить свой собственный AssemblyInfo.cs, который пригодится для InternalsVisibleToAttribute, CLSCompliantAttribute и другие, которые не генерируются автоматически.

Добавление AssemblyInfo.cs в проект

  1. В обозревателе решений щелкните правой кнопкой мыши <project name> > Add > New Folder,

Добавить новую папку

  1. Назовите папку "Свойства".

Имя папки Свойства

  1. Щелкните правой кнопкой мыши на папке "Свойства" и выберите Add > New Item...,

Добавить новый предмет

  1. Выберите "Класс" и назовите его "AssemblyInfo.cs".

Имя файла AssemblyInfo.cs

Подавление автоматически сгенерированных атрибутов

Если вы хотите переместить ваши атрибуты обратно в AssemblyInfo.cs вместо того, чтобы автоматически генерировать их, вы можете подавить их в MSBuild, как указал natemcmaster в своем ответе.

Добавляя ответ NightOwl888, вы можете пойти еще дальше и добавить AssemblyInfo класс, а не простой класс:

https://i.stack.imgur.com/VUaPN.png

Я хочу расширить эту тему / ответы следующим. Как кто-то упомянул, эта автоматически сгенерированная AssemblyInfo может стать препятствием для внешних инструментов. В моем случае, используя FinalBuilder, у меня была проблема, что AssemblyInfo не обновлялась при сборке. Очевидно, что FinalBuilder опирается на ~proj файл, чтобы найти местоположение AssemblyInfo. Я подумал, это было где-нибудь в папке проекта. Нет. Итак, меняя это

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

имел только задание, он допускал пользовательскую информацию о сборке, если собирал VS IDE/MS Build. Но мне нужно было, чтобы FinalBuilder тоже делал это без ручных манипуляций с файлом информации о сборке. Мне нужно было удовлетворить все программы, MSBuild/VS и FinalBuilder.

Я решил это, добавив запись в существующий ItemGroup

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

Теперь, имея этот элемент, FinalBuilder находит местоположение AssemblyInfo и модифицирует файл. В то время как действие None позволяет MSBuild/DevEnv игнорировать эту запись и больше не сообщать об ошибке на основе Compile действие, которое обычно идет с информацией о сборке в proj файлы.

C: \ Program Files \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): ошибка: были включены дублирующие элементы "Компиляция"..NET SDK по умолчанию включает элементы "Компиляция" из каталога вашего проекта. Вы можете удалить эти элементы из файла проекта или установить для свойства "EnableDefaultCompileItems" значение "false", если вы хотите явно включить их в файл проекта. Для получения дополнительной информации см. https://aka.ms/sdkimplicititems. Повторяющиеся элементы были: "AssemblyInfo.cs"

Спасибо, это мне очень помогло.

В моем случае создание проекта (веб-сайт на стороне сервера Blazor) было успешным как при «Выпуске», так и «Отладка», но публикация веб-сайта по-прежнему не удалась из-за ошибки «Дублирование атрибута», что немного смутило меня.

Решение заключалось в том, чтобы добавить <GenerateAssemblyInfo>false</GenerateAssemblyInfo> как в .csproj- а также .pubxml-файл:

Путь: <Project> / Properties / PublishProfiles / <ProfileName>.pubxml:

      <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
    <!-- Add the line below -->
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

С .NET 5+ вы можете использовать AssemblyMetadata:

<AssemblyMetadata Include="Bar" Value="Baz" />

Другие вопросы по тегам