相当于 dotnet 中的 AssemblyInfo core/csproj
Equivalent to AssemblyInfo in dotnet core/csproj
自从 dotnet 核心移回 .csproj
格式后,有一个新的自动生成的 MyProject.AssemblyInfo.cs
其中包含:
[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]
注意每次构建都会自动重新生成。
以前是在/obj/目录下找到的,现在好像只存在于内存中,因为在磁盘上找不到该文件,点击错误信息也打不开任何文件。
这是错误信息:
既然在那里定义了,我就不能自己在经典中定义它们了AssemblyInfo.cs
。
Where/how我可以定义项目的公司和版本吗?
这些设置已移入 .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
显示为"File Version",Version
显示为"Product version"
正如您已经注意到的,您可以在 .csproj 中控制其中的大部分设置。
如果您希望将这些保留在 AssemblyInfo.cs 中,您可以关闭 auto-generated 程序集属性。
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
如果您想了解幕后发生的事情,请查看 Microsoft.NET.Sdk 内的 Microsoft.NET.GenerateAssemblyInfo.targets。
您可以随时添加自己的 AssemblyInfo.cs,这对 InternalsVisibleToAttribute
、CLSCompliantAttribute
和其他未自动生成的内容会派上用场.
正在将 AssemblyInfo.cs 添加到项目
- 在解决方案资源管理器中,右键单击
<project name> > Add > New Folder
。
- 将文件夹命名为 "Properties"。
- 右键单击 "Properties" 文件夹,然后单击
Add > New Item...
。
- Select "Class" 并命名为 "AssemblyInfo.cs".
抑制自动生成的属性
如果您想将属性移回 AssemblyInfo.cs 而不是让它们自动生成,您可以在 MSBuild 中抑制它们,正如 natemcmaster 在 .
我想用以下内容扩展这个 topic/answers。正如有人提到的,这个自动生成的 AssemblyInfo 可能成为外部工具的障碍。在我的例子中,使用 FinalBuilder,我遇到了 AssemblyInfo 没有通过构建操作更新的问题。显然,FinalBuilder 依赖 ~proj
文件来查找 AssemblyInfo 的位置。我想,它正在寻找项目文件夹下的任何地方。不,所以,改变这个
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
只完成了一半的工作,如果由 VS IDE/MSBuild 构建,它允许自定义程序集信息。但是我也需要 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.0.2\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.targets(263,5):
error : Duplicate 'Compile' items were included. The .NET SDK includes 'Compile' items from your project directory by default.
You can either remove these items from your project file, or set the 'EnableDefaultCompileItems' property to 'false' if you want to explicitly include them in your project file.
For more information, see https://aka.ms/sdkimplicititems. The duplicate items were: 'AssemblyInfo.cs'
我为我的 .NET Standard 2.0 项目执行以下操作。
创建一个 Directory.Build.props
文件(例如,在您的存储库的根目录中)
并将要共享的属性从 .csproj
文件移动到此文件。
MSBuild 会自动拾取它并将它们应用到自动生成的 AssemblyInfo.cs
。
在 Visual Studio 2017 年使用 dotnet pack
或通过 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>
添加到 NightOwl888 的答案中,您可以更进一步添加 AssemblyInfo
class 而不是简单的 class:
对于 .NET 5+,您可以使用 AssemblyMetadata:
<AssemblyMetadata Include="Bar" Value="Baz" />
谢谢,这对我帮助很大。
在我的例子中,构建项目 Blazor Server Side Website
在 Release
和 Debug
上都成功了,但是发布网站仍然失败并出现 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>
自从 dotnet 核心移回 .csproj
格式后,有一个新的自动生成的 MyProject.AssemblyInfo.cs
其中包含:
[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]
注意每次构建都会自动重新生成。 以前是在/obj/目录下找到的,现在好像只存在于内存中,因为在磁盘上找不到该文件,点击错误信息也打不开任何文件。
这是错误信息:
既然在那里定义了,我就不能自己在经典中定义它们了AssemblyInfo.cs
。
Where/how我可以定义项目的公司和版本吗?
这些设置已移入 .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
显示为"File Version",Version
显示为"Product version"
正如您已经注意到的,您可以在 .csproj 中控制其中的大部分设置。
如果您希望将这些保留在 AssemblyInfo.cs 中,您可以关闭 auto-generated 程序集属性。
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
如果您想了解幕后发生的事情,请查看 Microsoft.NET.Sdk 内的 Microsoft.NET.GenerateAssemblyInfo.targets。
您可以随时添加自己的 AssemblyInfo.cs,这对 InternalsVisibleToAttribute
、CLSCompliantAttribute
和其他未自动生成的内容会派上用场.
正在将 AssemblyInfo.cs 添加到项目
- 在解决方案资源管理器中,右键单击
<project name> > Add > New Folder
。
- 将文件夹命名为 "Properties"。
- 右键单击 "Properties" 文件夹,然后单击
Add > New Item...
。
- Select "Class" 并命名为 "AssemblyInfo.cs".
抑制自动生成的属性
如果您想将属性移回 AssemblyInfo.cs 而不是让它们自动生成,您可以在 MSBuild 中抑制它们,正如 natemcmaster 在
我想用以下内容扩展这个 topic/answers。正如有人提到的,这个自动生成的 AssemblyInfo 可能成为外部工具的障碍。在我的例子中,使用 FinalBuilder,我遇到了 AssemblyInfo 没有通过构建操作更新的问题。显然,FinalBuilder 依赖 ~proj
文件来查找 AssemblyInfo 的位置。我想,它正在寻找项目文件夹下的任何地方。不,所以,改变这个
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
只完成了一半的工作,如果由 VS IDE/MSBuild 构建,它允许自定义程序集信息。但是我也需要 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.0.2\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.targets(263,5): error : Duplicate 'Compile' items were included. The .NET SDK includes 'Compile' items from your project directory by default. You can either remove these items from your project file, or set the 'EnableDefaultCompileItems' property to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms/sdkimplicititems. The duplicate items were: 'AssemblyInfo.cs'
我为我的 .NET Standard 2.0 项目执行以下操作。
创建一个 Directory.Build.props
文件(例如,在您的存储库的根目录中)
并将要共享的属性从 .csproj
文件移动到此文件。
MSBuild 会自动拾取它并将它们应用到自动生成的 AssemblyInfo.cs
。
在 Visual Studio 2017 年使用 dotnet pack
或通过 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>
添加到 NightOwl888 的答案中,您可以更进一步添加 AssemblyInfo
class 而不是简单的 class:
对于 .NET 5+,您可以使用 AssemblyMetadata:
<AssemblyMetadata Include="Bar" Value="Baz" />
谢谢,这对我帮助很大。
在我的例子中,构建项目 Blazor Server Side Website
在 Release
和 Debug
上都成功了,但是发布网站仍然失败并出现 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>