由于 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
中自己定义它们。
我在哪里/如何定义项目的公司和版本?
正如您已经注意到的,您可以在 .csproj 中控制大多数这些设置。
如果您希望将这些保留在 AssemblyInfo.cs 中,您可以关闭自动生成的程序集属性。
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
如果您想了解幕后情况,请查看 Microsoft.NET.Sdk 中的 Microsoft.NET.GenerateAssemblyInfo.targets。
这些设置已移至 .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 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>
您可以随时添加自己的 AssemblyInfo.cs,这对于 InternalsVisibleToAttribute
、CLSCompliantAttribute
和其他非自动生成的文件非常有用。
将 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 中指出的那样。
PublicKey
。但是,它不适用于 CLSCompliant
,因为它自动引用了该值。见:github.com/dotnet/msbuild/issues/2281。看起来现在也可能已经修复了。
添加到 NightOwl888 的答案中,您可以更进一步,添加一个 AssemblyInfo
类,而不仅仅是一个普通的类:
https://i.stack.imgur.com/VUaPN.png
我想用以下内容扩展这个主题/答案。正如有人提到的,这种自动生成的 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'
谢谢,这对我帮助很大。
就我而言,在 Release
和 Debug
上构建项目 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>
使用 .NET 5+,您可以使用 AssemblyMetadata:
<AssemblyMetadata Include="Bar" Value="Baz" />
不定期副业成功案例分享