c#在构建时设置值

时间:2018-04-12 14:56:15

标签: c# asp.net

今天我在asp.net页面中有以下代码:

df = df.xs(df.index.levels[0][0])

print (df)
                       'sum'
col1 col2 col3   col4       
1    34   green  10      0.0
          yellow 30      1.5
          orange 20      1.1

是否可以在构建时设置此项:

<span>V2.0.412</span>

1 个答案:

答案 0 :(得分:1)

您最接近开箱即可使用AssemblyVersionAttribute,为构建/修订指定一个星号(强调我的):

  

您可以指定所有值,也可以使用星号(*接受默认的内部版本号,修订号或两者。例如,[assembly:AssemblyVersion("2.3.25.1")]表示2为主要版本,3表示次要版本,25表示构建号,1表示版本号。诸如[assembly:AssemblyVersion("1.2.*")]的版本号指定1作为主要版本,2指定为次要版本,并接受默认的构建和修订号。诸如[assembly:AssemblyVersion("1.2.15.*")]的版本号指定1作为主要版本,2作为次要版本,15作为构建号,并接受默认修订号。 默认内部版本号每天递增。默认修订号是自当地时间午夜起的秒数(不考虑夏令时的时区调整)除以2。

类似于:

[assembly:AssemblyVersion("2.0.*")]

然后,您可以根据上述说明从中提取DateTime值。您需要更改ASP.NET页面以调用实用程序方法来检索DateTime,但它仍然是构建时间。

不可否认,这将是一个构建本地时间而不是时间戳,但这对你来说可能已经足够了。

请注意,根据您的项目系统,您可能需要禁用编译确定性才能使其生效,如上面的示例所示。

这是一个简单的.NET Core应用程序,用于演示:

using System;
using System.Reflection;

[assembly:AssemblyVersion("1.2.*")]

class Test
{
    static void Main()
    {
        var version = typeof(Test).GetTypeInfo().Assembly.GetName().Version;
        Console.WriteLine($"Assembly version: {version}");
        Console.WriteLine($"Build time: {ConvertToDateTime(version)}");
    }

    static DateTime ConvertToDateTime(Version version) =>
        new DateTime(2000, 1, 1)
            .AddDays(version.Build)
            .AddSeconds(version.Revision * 2);
}

(2000年1月1日的时期在old MSDN docs中指定,但在新的时期并不明显。)

项目文件:

<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <LangVersion>latest</LangVersion>
    <Deterministic>false</Deterministic>
  </PropertyGroup>    
</Project>

您甚至可以在csproj中设置AssemblyVersion - 尽管如此,您还需要设置AssemblyFileVersion,或禁用CS7035。示例使用与上面相同的代码,但没有[assembly:AssemblyVersion]行:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <AssemblyVersion>1.2.*</AssemblyVersion>
    <FileVersion>1.2.0.0</FileVersion>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <LangVersion>latest</LangVersion>
    <Deterministic>false</Deterministic>
  </PropertyGroup>
</Project>

我的盒子上的示例输出:

Assembly version: 1.2.6676.30244
Build time: 12/04/2018 16:48:08

在多个dotnet run调用之间,该输出保持不变,直到我更改源文件,此时它将被重建,并且构建时间也会相应地更改。

如果你不遵循如何从中获取你想要的字符串,这里有一个自包含的方法完全,假设你已经将程序集版本设置为使用{{ 1}}如上所述:

*

目前(在写作时,在我的机器上)返回“412”。

另一种选择是生成代码作为构建的一部分,但这将转移到更自定义的项目区域。