【问题标题】:How to automatically substitute string at compile time (C# DLL)如何在编译时自动替换字符串(C# DLL)
【发布时间】:2014-05-22 18:04:18
【问题描述】:

我正在使用 Visual Studio 2013 编译 DLL,但由于技术原因无法使用 System.Version,因为我的目标运行时环境之一不支持它。

有没有办法在编译时自动将程序集“FileVersion”放入常量中?

public const string MyFileVersion = "{{ PLEASE REPLACE ME }}";

我没有使用构建服务器或任何类似的东西,只是使用 Visual Studio 2013。

【问题讨论】:

  • 您可以使用#ifdev 并设置编译变量。
  • @Dmitry 可以从汇编文件版本自动更新吗?我不想让我忘记更新多个版本的维护地狱......
  • 这是一个明显的先有鸡还是先有蛋的问题。您需要一个知道下一个版本号的预言机。您必须提供一个,编写您自己的程序来修改一个包含该属性的小 .cs 文件,并根据您喜欢的任何规则对其进行修改。在预构建事件中运行它。请记住,[AssemblyFileVersion] 毫无用处,CLR 完全忽略了它。它只是注释性的,当您查看文件属性时,您会在详细信息选项卡中看到它。就是这样。

标签: c# visual-studio build visual-studio-2013


【解决方案1】:

似乎 t4 模板可以帮助您。这是template generation engine。有足够的相关信息会有所帮助。

我制作了一个简单的模板,可以满足您的需求。这只是一个示例,您可能需要在代码中进行一些调整:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.CSharp.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="System.Reflection" #>
<#@ output extension=".cs" #>

<#
        var assemblyVersionRegex = new Regex(@"AssemblyVersion\(\""(?<version>(.*?))\""\)");
        var pathBase = new FileInfo(Host.TemplateFile).DirectoryName;
        var assemblyInfoPath = Path.Combine(pathBase, @"Properties\AssemblyInfo.cs");

        var assemblyInfoSources = File.ReadAllText(assemblyInfoPath);
        var match = assemblyVersionRegex.Match(assemblyInfoSources);
        var version = match.Success 
                ? match.Groups["version"].Value
                : "unknow";
#>

public static class SomeAssemblyInfo
{
    public const string Version = "<#= version #>";
}

因此,它会读取文件 AssemblyInfo.cs(或其他文件,如果需要)从中获取版本并准备类 SomeAssemblyInfo :

public static class SomeAssemblyInfo
{
    public const string Version = "1.0.0.0";
}

您需要做的最后一件事是在构建时运行此模板。 Here你可以找到方法。

【讨论】:

  • 这看起来可能是答案,虽然我收到一个错误:“错误 62 编译转换:当前上下文中不存在名称‘主机’”
  • @LeaHayes,你在第一行设置了 hostspecific="true"
  • 我的错,我不小心将同一行粘贴了两次。这完美!你是救生员:)
  • 我需要稍微更改模板,因为我需要“FileVersion”,但这很简单。
  • @LeaHayes 是的,这只是想法,如何获取版本取决于您。您可以加载已编译的程序集,或发出 Web 请求。没关系
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 2013-05-25
  • 2013-02-02
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多