相当于 dotnet core/csproj 中的 AssemblyInfo

Posted

技术标签:

【中文标题】相当于 dotnet core/csproj 中的 AssemblyInfo【英文标题】:Equivalent to AssemblyInfo in dotnet core/csproj 【发布时间】:2017-06-27 13:32:20 【问题描述】:

由于 dotnet 核心移回 .csproj 格式,有一个新的自动生成的 MyProject.AssemblyInfo.cs,其中包含:

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

注意,这是在每次构建时自动重新生成的。 之前在 /obj/ 目录中找到该文件,现在它似乎只在内存中,因为在磁盘上找不到该文件并且单击错误消息不会打开任何文件。

这是错误信息:

由于它们是在那里定义的,我无法在经典的AssemblyInfo.cs 中自己定义它们。

在哪里/如何定义项目的公司和版本?

【问题讨论】:

请注意,这与 dotnet core 并不严格相关。这与基于 .csproj 的新格式相当相关。将这种新的 .csproj 格式与旧的 .NET Framework 结合使用非常好,例如 net461 【参考方案1】:

您已经注意到,您可以在 .csproj 中控制大部分设置。

如果您希望将这些保留在 AssemblyInfo.cs 中,您可以关闭自动生成的程序集属性。

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

如果您想了解幕后发生的事情,请查看 Microsoft.NET.Sdk 内的 Microsoft.NET.GenerateAssemblyInfo.targets。

【讨论】:

很高兴看到我可以关闭这个东西。称我为老式的,但我更喜欢旧的 AssemblyInfo.cs 文件而不是自动生成的 .netcore 文件。此外,我使用外部工具来管理我的版本和其他 AssembyInfo 条目的内容。我尝试使用自定义目标将我的属性排除在项目本身之外,但它让我窒息了一段时间。 NuGet 不读取 AssemblyInfo.cs。您仍然必须使用 MSBuild 属性来定义 NuGet 包版本。 自动生成文件时,如何设置csproj新格式的InternalsVisibleTo属性? @Shubhan 这不是自动生成的属性之一。在项目的某处创建一个空的 .cs 文件并将 InternalsVisibleTo 代码添加到其中 @PandaWood 有很多充分的理由来“坚持”AssemblyInfos。一开始它们更容易共享和编辑。如果是新的一年,我需要更改我的版权属性中的日期,或者如果我决定更改公司属性中的文本等,我不想单独打开数百个项目或数十个解决方案来这样做,我也不想手动编辑 .csproj 文件。使用 AssemblyInfo 很容易 - Shared.AssemblyInfo.cs,作为 IDE UI 中的链接添加。每次破解新的做事方式都比这更难,而且浪费开发时间。【参考方案2】:

这些设置已移至 .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 显示为“产品版本”

【讨论】:

如果我的项目类型是Class Library (.NET Standard),项目属性中的设置似乎丢失了。你知道为什么吗?我正在使用版本 15.1,版本 26403.7,社区版。 我正在使用类库(.NET 标准)并在 Packages 选项卡中查看它。你在那里看到了吗?一旦您“保存”默认值以外的其他内容,它将显示在 csproj 中。 在使用包选项卡时如何使用通配符如 1.0.*.*? @Soenhay,通配符在定义包版本时没有多大意义,只有在使用它时才有意义。 @Soenhay 我的理解是,除非您在第三方工具中使用类似的功能,否则您不能这样做。【参考方案3】:

我为我的 .NET Standard 2.0 项目执行以下操作。

创建一个Directory.Build.props 文件(例如,在您的存储库的根目录中) 并将要共享的属性从.csproj 文件移动到此文件。

MSBuild 会自动获取它并将它们应用到自动生成的AssemblyInfo.cs

在使用 dotnet pack 或通过 Visual Studio 2017 中的 UI 构建一个包时,它们也会应用于 nuget 包。

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

例子:

<Project>
    <PropertyGroup>
        <Company>Some company</Company>
        <Copyright>Copyright © 2020</Copyright>
        <AssemblyVersion>1.0.0.1</AssemblyVersion>
        <FileVersion>1.0.0.1</FileVersion>
        <Version>1.0.0.1</Version>
        <!-- ... -->
    </PropertyGroup>
</Project>

【讨论】:

我将 Directory.Build.props 添加到解决方案的根目录,更新它以设置我的公司、产品和版权,然后构建解决方案。当我打开任何项目时,它们没有这三个字段的正确值。我错过了什么? @Justin,您不会在项目文件中看到它们;它们被应用于生成的构建程序集。 我们这些不使用 msbuild 的人呢? 这很好。但是还有其他场景,当构建非常大的多解决方案时,一些项目是 .Net Standard,其他项目是 .Net FW/不同版本等?当第三方工具进行版本控制时,它们会设置其他一些附加和自定义属性。【参考方案4】:

您可以随时添加自己的AssemblyInfo.cs,这对于InternalsVisibleToAttributeCLSCompliantAttribute 和其他非自动生成的文件非常有用。

将 AssemblyInfo.cs 添加到项目中

    在解决方案资源管理器中,右键单击&lt;project name&gt; &gt; Add &gt; New Folder

    将文件夹命名为“属性”。

    右键单击“属性”文件夹,然后单击Add &gt; New Item...

    选择“类”并将其命名为“AssemblyInfo.cs”。

抑制自动生成的属性

如果您想将属性移回 AssemblyInfo.cs 而不是自动生成它们,您可以在 MSBuild 中抑制它们,正如 natemcmaster 在 his answer 中指出的那样。

【讨论】:

感谢 NightOwl888,这就是我正在寻找的答案。 我会避免假设现在每个人都有 Visual Studio,还有其他编辑器可以用来使这个答案难以理解(例如,我在 Mac/Mono 上使用 Jetbrains Rider ) 有时,新的 Microsoft 领导应考虑保留与 AssemblyInfo.cs 配合良好的内容,以便自动构建仍然可以修改内部版本号。【参考方案5】:

添加到 NightOwl888 的答案,您可以更进一步,添加一个 AssemblyInfo 类,而不仅仅是一个普通的类:

【讨论】:

当我在 VS2019 中为 netstandard 1.1 项目打开此对话框时,没有“程序集信息文件”。 感谢您发布此信息!我正在使用 .NET Core 3.1,它就在那里!它添加了所有关键的默认部分。【参考方案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 文件中的 Assembly Info 条目。

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'

【讨论】:

【参考方案7】:

谢谢,这对我帮助很大。

就我而言,在ReleaseDebug 上构建项目Blazor Server Side Website 都成功了,但是发布网站仍然失败并出现Duplicate Attribute 错误,这让我有点困惑。

解决方案是将&lt;GenerateAssemblyInfo&gt;false&lt;/GenerateAssemblyInfo&gt; 同时添加到.csproj.pubxml 文件中:

路径:&lt;Project&gt;/Properties/PublishProfiles/&lt;ProfileName&gt;.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>

【讨论】:

【参考方案8】:

使用 .NET 5+,您可以使用 AssemblyMetadata:

&lt;AssemblyMetadata Include="Bar" Value="Baz" /&gt;

【讨论】:

答案没有解释它是如何解决问题的。 任何有关此的 msdn / doc / 其他资源?

以上是关于相当于 dotnet core/csproj 中的 AssemblyInfo的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq, windows/linux, c/c++/node.js/golang/dotnet

DotNet 4.0调用TTS引擎实现朗读功能更简洁~

dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库

Rider 说无法更新路径“/usr/share/dotnet/dotnet”中的 dotnet 核心

dotnet 中的污染流分析

dotnet发布命令不适用于aws buildspecs.yml文件中的asp dotnet项目