等效于dotnet core / csproj中的AssemblyInfo


236

由于dotnet核心移回了.csproj格式,因此自动生成了一个新的MyProject.AssemblyInfo.cs包含其中的内容。

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

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

这是错误消息: 在此处输入图片说明

由于它们是在那里定义的,所以我无法在古典音乐中自己定义它们AssemblyInfo.cs

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


5
请注意,这与dotnet核心并不严格相关。这与新的基于.csproj的格式有关。最好将这种新的.csproj格式与旧的.NET Framework一起使用,例如net461
Jim Aho

Answers:


334

正如您已经注意到的,您可以在.csproj中控制大多数这些设置。

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

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

如果你想看看发生了什么引擎盖下,结账Microsoft.NET.GenerateAssemblyInfo.targets Microsoft.NET.Sdk内。


41
很高兴看到我可以关闭此功能。称我为老式,但比起自动生成的.netcore,我更喜欢老式的AssemblyInfo.cs文件。此外,我使用外部工具来管理我的版本和其他AssembyInfo条目的内容。我试图使用一个自定义目标将我的属性保留在项目本身之外,但是这让我cho了一会儿。
Ivaylo Slavov

1
同样在这里。使用新的基于csproj的系统,我无法使用旧版工具。有了这个属性,我现在可以回去了,我很喜欢!
6

5
NuGet不读取AssemblyInfo.cs。您仍然必须使用MSBuild属性来定义NuGet软件包的版本。
natemcmaster

6
自动生成文件时,如何以新的csproj格式设置InternalsVisibleTo属性?
Shubhan

8
@Shubhan这不是自动生成的属性之一。在您的项目中的某个地方创建一个空的.cs文件,并向其中添加InternalsVisibleTo代码
natemcmaster

128

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


1
如果我的项目类型为,则似乎缺少项目属性中的设置Class Library (.NET Standard)。你知道为什么吗 我正在使用版本15.1,版本26403.7,社区版。
ventiseis

2
我正在使用类库(.NET Standard),并在“程序包”选项卡中看到它。你看到那里了吗?一旦“保存”默认值以外的内容,它将显示在csproj中。
tofutim

3
使用“软件包”标签时,如何使用通配符(如1.0。*。*)?
Soenhay

@Soenhay,通配符在定义软件包版本时没有太大意义,仅在使用时才有意义。
Paul Hatcher

@Soenhay我的理解是,除非在第三方工具中使用类似的功能,否则您将无法使用。
hultqvist

115

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

创建一个Directory.Build.props文件(例如,在仓库的根目录中),然后将要共享的属性从.csproj文件移动到该文件。

MSBuild将自动将其拾取并将其应用于自动生成的AssemblyInfo.cs

dotnet pack在Visual Studio 2017中使用UI或通过UI 生成nuget包时,它们也将应用于nuget包。

请参阅https://docs.microsoft.com/zh-cn/visualstudio/msbuild/customize-your-build


12
这应该获得更多支持,很高兴允许自动生成,但仍然在整个解决方案中共享一些东西
Dan

@Dan Agreed,这远远低于其他答案,我怀疑大多数人都不会最终阅读本文。
伦尼克斯

1
@Justin,您不会在项目文件中看到它们;它们将应用于生成的装配体上。
pfx

1
我们这些不使用msbuild的人呢?
乔·菲利普斯

1
这是一个很好的答案。谢谢。在我们的大型解决方案中使用了该解决方案,该解决方案生成了一些NuGet软件包,对于新的sdk样式项目,这是旧装配信息的绝佳替代方案
David Anderson

57

您可以随时添加自己的AssemblyInfo.cs,其中就派上用场了InternalsVisibleToAttributeCLSCompliantAttribute和其他人都不会自动生成。

将AssemblyInfo.cs添加到项目

  1. 在解决方案资源管理器中,右键单击<project name> > Add > New Folder

新增资料夹

  1. 将文件夹命名为“ Properties”。

名称文件夹属性

  1. 右键单击“属性”文件夹,然后单击确定Add > New Item...

新增项目

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

名称文件AssemblyInfo.cs

禁止自动生成的属性

如果要将属性移回AssemblyInfo.cs而不是自动生成属性,则可以按照natemcmaster在其答案中指出的那样在MSBuild中禁止显示。


1
感谢NightOwl888,这是我正在寻找的答案。
Juniuz

3
我会避免假设这些天的每个人都拥有Visual Studio,可能会使用其他编辑器来使某些人很难回答这个问题(例如,我在使用Jetbrains Rider的Mac / Mono上执行此操作)
PandaWood

有时,新的Microsoft主管应考虑与AssemblyInfo.cs保持良好的配合,以便自动构建仍然可以修改构建号。
justdan23

6

除了NightOwl888的答案外,您还可以进一步增加一个AssemblyInfo类,而不仅仅是简单的类:

在此处输入图片说明


5
当我在VS2019中为netstandard 1.1项目打开此对话框时,没有“程序集信息文件”。
SwissCoder

感谢您发布!我正在使用.NET Core 3.1,它就在那里!它添加了所有关键的默认部件。
justdan23

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

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”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.