Эквивалент 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 в проект
- В обозревателе решений щелкните правой кнопкой мыши
<project name> > Add > New Folder
,
- Назовите папку "Свойства".
- Щелкните правой кнопкой мыши на папке "Свойства" и выберите
Add > New Item...
,
- Выберите "Класс" и назовите его "AssemblyInfo.cs".
Подавление автоматически сгенерированных атрибутов
Если вы хотите переместить ваши атрибуты обратно в AssemblyInfo.cs вместо того, чтобы автоматически генерировать их, вы можете подавить их в MSBuild, как указал natemcmaster в своем ответе.
Добавляя ответ NightOwl888, вы можете пойти еще дальше и добавить AssemblyInfo
класс, а не простой класс:
Я хочу расширить эту тему / ответы следующим. Как кто-то упомянул, эта автоматически сгенерированная 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" />