如何手动设置程序集版本

时间:2017-08-09 14:31:05

标签: c# asp.net-core

这个让我头疼。我们过去常常把项目属性放在[assembly: AssemblyVersion("1.0.0.0")]下面。我对变化完全没问题,所以我不在乎它在哪里。我知道他们也会为版本制定一个新标准,也完全没问题。

那里有大量文档指向project.json文件,这显然是一种浪费,因为这不再是一个合法的文件。更近期的说法将以下内容添加到您的.csproj文件中:

<PropertyGroup>
    <VersionPrefix>1.2.3</VersionPrefix>
    <VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>

也是一种浪费。只是因为我似乎无法阅读它。以下内容总是给我1.0.0.0

PlatformServices.Default.Application.ApplicationVersion

更何况当我在File Explorer中右键单击并点击Properties,然后Details标签也始终显示1.0.0.0

那么,我如何在我的解决方案中设置每个程序集的版本,然后在运行时读取它们呢?

2 个答案:

答案 0 :(得分:4)

On方法是在项目文件中设置以下任一值:

<PropertyGroup>
    <Version>1.3.5.7</Version>
    <FileVersion>2.4.6.8</FileVersion>
</PropertyGroup>

并按照以下方式阅读:

var fileVersion = Assembly.GetEntryAssembly()
    .GetCustomAttribute<AssemblyFileVersionAttribute>()
    .Version;

var informationalVersion = Assembly.GetEntryAssembly()
    .GetCustomAttribute<AssemblyInformationalVersionAttribute>()
    .InformationalVersion;

值得注意的是,在.csproj文件中设置这些值会自动生成(因此不要尝试编辑它)类似于包含以下内容的遗留AssemblyInfo.cs的文件:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

//snip    
[assembly: System.Reflection.AssemblyFileVersionAttribute("2.4.6.8")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.3")]

// Generated by the MSBuild WriteCodeFragment class.

答案 1 :(得分:0)

当.Net Core 2.0 问世时,结果就开始了。当您右键单击项目然后单击属性时,会有一个用户界面,如下所示:

UI of Project Properties

Package VersionAssembly VersionAssembly File Version对应Version文件中的AssemblyVersionFileVersion.csproj设置分别为:

<PropertyGroup>
  <Version>1.1.0</Version>
  <AssemblyVersion>1.1.0.9</AssemblyVersion>
  <FileVersion>1.1.0.9</FileVersion>
</PropertyGroup>

然后我在我的解决方案的每个项目中创建了一个实用程序方法,它执行以下操作:

public static VersionInformationModel GetVersionInformation() {
  var Result = new VersionInformationModel {
    Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(),
    BuildDate = System.IO.File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location),
    Configuration = Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyConfigurationAttribute>().Configuration,
    TargetFramework = Assembly.GetExecutingAssembly().GetCustomAttribute<System.Runtime.Versioning.TargetFrameworkAttribute>().FrameworkName,
  };

  return Result;
}

因此,在我网站的管理页面上,我可以知道每个项目的版本和其他详细信息,因为它位于我正在查看的任何服务器上。