visual studio-如何在编译时自动替换字符串(C#DLL)

本文关键字:替换 字符串 C#DLL studio- 编译 visual | 更新日期: 2023-09-27 17:57:39

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

有没有一种方法可以在编译时自动将程序集"FileVersion"放入常量中?

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

我没有使用构建服务器或类似的高级服务器,只是使用Visual Studio 2013。

visual studio-如何在编译时自动替换字符串(C#DLL)

看起来t4模板可以帮助您。它是模板生成引擎。有足够的信息会有所帮助。

我做了一个简单的模板,可以做你想要的。这只是一个例子,你可能需要对代码进行一些调整:

<#@ 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";
}

您需要做的最后一件事是在构建时运行此模板。在这里你可以找到如何做到这一点。