ChatGPT解决这个技术问题 Extra ChatGPT

相当于 dotnet core/csproj 中的 AssemblyInfo

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

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

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

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

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

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

请注意,这与 dotnet 核心并不严格相关。这与基于 .csproj 的新格式相当相关。将这种新的 .csproj 格式与旧的 .NET Framework 结合使用非常好,例如 net461

T
T.S.

正如您已经注意到的,您可以在 .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 中的链接添加。每次破解新的做事方式都比这更难,而且浪费开发时间。
h
hultqvist

这些设置已移至 .csproj 文件中。

默认情况下,它们不会显示,但您可以从 Visual Studio 2017 的项目属性 Package 选项卡中发现它们。

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

保存后,可以在 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 我的理解是,除非您在第三方工具中使用类似的功能,否则您不能这样做。
P
Pang

我为我的 .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/不同版本等?当第三方工具进行版本控制时,它们会设置其他一些附加和自定义属性。
我的情况的完美解决方案!谢谢 :-)
N
NightOwl888

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

将 AssemblyInfo.cs 添加到项目

在解决方案资源管理器中,右键单击 <项目名称> > 添加 > 新文件夹。

https://i.stack.imgur.com/6h0Pq.png

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

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

右键单击“属性”文件夹,然后单击添加 > 新项目...。

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

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

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

抑制自动生成的属性

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


感谢 NightOwl888,这就是我正在寻找的答案。
我会避免假设现在每个人都有 Visual Studio,还有其他编辑器可以用来使这个答案难以理解(例如,我正在使用 Jetbrains Rider 在 Mac/Mono 上执行此操作)
有时,新的 Microsoft 领导应该考虑保留与 AssemblyInfo.cs 配合良好的内容,以便自动构建仍然可以修改内部版本号。
如果您像我一样希望避免仅为 InternalsVisibleToAttribute 创建自己的 AssemblyInfo.cs,那么 @meziantou 在他的博文 meziantou.net/declaring-internalsvisibleto-in-the-csproj.htm 中写道
@Sameer - 谢谢。实际上,我们确实使用了这种方法,只是我们进一步改进了它,如果启用了该选项:github.com/apache/lucenenet/blob/…,它会自动为强命名程序集生成 PublicKey。但是,它不适用于 CLSCompliant,因为它自动引用了该值。见:github.com/dotnet/msbuild/issues/2281。看起来现在也可能已经修复了。
d
datchung

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

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


当我在 VS2019 中为 netstandard 1.1 项目打开此对话框时,没有“程序集信息文件”。
感谢您发布此信息!我正在使用 .NET Core 3.1,它就在那里!它添加了所有关键的默认部分。
T
T.S.

我想用以下内容扩展这个主题/答案。正如有人提到的,这种自动生成的 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'


E
Edgar.Bro

谢谢,这对我帮助很大。

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

解决方案是将 <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>

V
Vadim Peretokin

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

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


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