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

236

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

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

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

Это сообщение об ошибке: введите описание изображения здесь

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

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

hultqvist
источник
5
Обратите внимание, что это не строго связано с ядром dotnet. Это скорее связано с новым форматом на основе .csproj. Вполне нормально использовать этот новый формат .csproj с таргетингом на старую .NET Framework, например net461
Джим Ахо

Ответы:

334

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

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

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

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

natemcmaster
источник
41
Рад видеть, что я могу выключить эту вещь. Назовите меня старомодным, но я предпочитаю старый добрый файл AssemblyInfo.cs, чем автоматически сгенерированный материал .netcore. Кроме того, я использую внешние инструменты для управления своими версиями и содержимым других записей AssembyInfo. Я пытался использовать пользовательскую цель, чтобы мои свойства не попадали в сам проект, но это заставило меня задохнуться на некоторое время.
Ивайло Славов
1
Тоже самое. С новой системой на базе csproj я не смог использовать свои устаревшие инструменты. С этим свойством я теперь могу вернуться, что я люблю!
Построен
5
NuGet не читает AssemblyInfo.cs. Вам все еще нужно использовать свойства MSBuild для определения версии пакета NuGet.
natemcmaster
6
когда файл генерируется автоматически, как установить атрибут InternalsVisibleTo в новом формате csproj?
Шубхан
8
@Shubhan это не один из автоматически сгенерированных атрибутов. Создайте пустой файл .cs где-нибудь в своем проекте и добавьте в него код InternalsVisibleTo
natemcmaster
128

Эти настройки перенесены в файл .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как «Версия продукта».

hultqvist
источник
1
Настройки в свойствах проекта, кажется, отсутствуют, если мой тип проекта Class Library (.NET Standard). У тебя есть идеи почему? Я использую версию 15.1, выпуск 26403.7, Community Edition.
ventiseis
2
Я использую библиотеку классов (.NET Standard) и вижу ее на вкладке «Пакеты». Вы видите это там? Как только вы «сохраните» что-то кроме значений по умолчанию, оно появится в csproj.
тофутим
3
Как вы используете подстановочные знаки, такие как 1.0. *. * При использовании вкладки пакетов?
Soenhay
@ Soenhay, подстановочные знаки не имеют большого смысла при определении версии пакета, только при ее использовании.
Пол Хэтчер
@ Я так понимаю, что вы не можете, если вы не используете подобную функцию в сторонних инструментах.
hultqvist
115

Я делаю следующее для своих проектов .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.

PFX
источник
12
Это должно получить больше откликов, неплохо позволить автоматически генерироваться, но все же делиться некоторыми вещами во всем решении
Дан
@ Дэн Согласен, это так далеко от других ответов, что я подозреваю, что большинство людей просто не заканчивают читать это.
Lunyx
1
@ Джастин, вы не увидите их в файлах проекта; они применяются к полученным построенным сборкам.
PFX
1
Как насчет тех из нас, кто не использует msbuild?
Джо Филлипс
1
Это был отличный ответ. Спасибо. Использовал его в нашем большом решении, которое производит некоторые пакеты NuGet, и это отличная альтернатива старой информации о сборке для новых проектов в стиле SDK
Дэвид Андерсон
57

Вы всегда можете добавить свой собственный 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
источник
1
Спасибо NightOwl888, это ответ, который я ищу.
Юнюз
3
Я бы не стал предполагать, что у всех есть Visual Studio в наши дни, есть другие редакторы, которые могут быть использованы для затруднения понимания этого ответа для некоторых (например, я делаю это на Mac / Mono с использованием Jetbrains Rider)
PandaWood
Иногда новым руководителям Microsoft следует подумать о том, чтобы сохранить то, что хорошо работает с AssemblyInfo.cs, чтобы автоматизированные сборки все еще могли работать для изменения номеров сборок.
justdan23
6

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

введите описание изображения здесь

datchung
источник
5
Когда я открываю это диалоговое окно в VS2019 для нестандартного проекта 1.1, «Файл информации о сборке» отсутствует.
SwissCoder
Спасибо за публикацию этого! Я использую .NET Core 3.1, и это было прямо здесь! Он добавляет все ключевые части по умолчанию.
justdan23
6

Я хочу расширить эту тему / ответы следующим. Как кто-то упомянул, эта автоматически сгенерированная 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»

TS
источник