Еквівалентно AssemblyInfo в ядрі dotnet / csproj


236

Оскільки ядро ​​dotnet повернулося до .csprojформату, з'явилася нова автогенерована, MyProject.AssemblyInfo.csяка містить серед іншого.

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

Зауважте, що це автоматично регенерується в кожній збірці. Раніше файл знаходився в каталозі / obj /, тепер він, мабуть, є лише в пам'яті, оскільки файл не можна знайти на диску, а натискання повідомлення про помилку не відкриває жодного файлу.

Це повідомлення про помилку: введіть тут опис зображення

Оскільки вони визначені там, я не можу сам їх визначити у класичному AssemblyInfo.cs.

Де / як я можу визначити компанію та версію проекту?


5
Зауважте, що це не суворо пов'язане з ядром dotnet. Це скоріше пов'язане з новим форматом на основі .csproj. Цілком прекрасно використовувати цей новий формат .csproj з націленням на стару .NET Framework, наприклад net461
Jim Aho

Відповіді:


334

Як ви вже помітили, ви можете керувати більшістю цих параметрів у .csproj.

Якщо ви хочете зберегти їх у AssemblyInfo.cs, ви можете вимкнути автоматично створені атрибути збірки.

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

Якщо ви хочете побачити, що відбувається під кришкою, перевірте Microsoft.NET.GenerateAssemblyInfo.targets всередині Microsoft.NET.Sdk.


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відображається як "Версія продукту"


1
Налаштування властивостей проекту, здається, відсутні, якщо мій тип проекту Class Library (.NET Standard). У вас є ідеї, чому? Я використовую версію 15.1, випуск 26403.7, видання Community.
ventiseis

2
Я використовую бібліотеку класів (.NET Standard) і бачу її на вкладці "Пакети". Ви це бачите там? Після того як ви "Збережіть" щось інше, ніж за замовчуванням, воно з’явиться в csproj.
tofutim

3
Як ви використовуєте підстановку на зразок 1.0. *. * Під час використання вкладки пакетів?
Soenhay

@Soenhay, wildcarding не має особливого сенсу при визначенні версії пакета, лише при споживанні.
Пол Хетчер

@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


12
Це повинно отримати більше результатів, приємно дозволити автоматичне створення, але все ж поділитися деякими матеріалами в усьому рішенні
Dan

@Дан Погодився, це набагато нижче інших відповідей, що я підозрюю, що більшість людей просто не закінчують читати це.
Лунікс

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 .


1
Дякую NightOwl888, це відповідь, яку я шукаю.
Juniuz

3
Я б не припускав, що кожен має Visual Studio в наші дні, є й інші редактори, які можуть бути використані, що важко дотримуватися цієї відповіді (наприклад, я роблю це на Mac / Mono за допомогою Jetbrains Rider)
PandaWood

Іноді нові лідери Microsoft повинні розглянути можливість збереження того, що добре працює з AssemblyInfo.cs, щоб автоматизовані збірки все ще могли працювати для зміни номерів збірки.
justdan23

6

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

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


5
Немає "Інформаційного файлу збірки", коли я відкриваю це діалогове вікно у VS2019 для проекту netstandard 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: \ Файли програми \ 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'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.