Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在编译时自动替换字符串(C DLL)_C#_Visual Studio_Build_Visual Studio 2013 - Fatal编程技术网

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

C# 如何在编译时自动替换字符串(C DLL),c#,visual-studio,build,visual-studio-2013,C#,Visual Studio,Build,Visual Studio 2013,我正在使用Visual Studio 2013编译DLL,由于技术原因,无法使用System.Version,因为我的一个目标运行时环境不支持它 是否有一种方法可以在编译时自动将程序集文件版本放入常量中 public const string MyFileVersion = "{{ PLEASE REPLACE ME }}"; 我不使用构建服务器或任何类似的东西,只使用Visual Studio 2013。似乎t4模板可以帮助您。是的。有足够的信息,这将是有益的 我做了一个简单的模板,你想要什

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

是否有一种方法可以在编译时自动将程序集文件版本放入常量中

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

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

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

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

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

您需要做的最后一件事是在构建时运行此模板。您可以找到如何执行此操作。

您可以使用和设置编译变量。@Dmitry是否可以从程序集文件版本自动更新它?我不想在维护地狱里忘记更新多个版本…这是一个明显的鸡和蛋的问题。您需要一个知道下一个版本号需要是什么的oracle。您必须提供一个,编写您自己的程序来修改一个包含该属性的小.cs文件,并根据您喜欢的规则对其进行修改。在预构建事件中运行它。请记住,[AssemblyFileVersion]是非常无用的,CLR会完全忽略它。它只是注释性的,当您查看文件属性时,可以在“详细信息”选项卡中看到它。仅此而已。您可以使用和设置编译变量。@Dmitry它可以从程序集文件版本自动更新吗?我不想在维护地狱里忘记更新多个版本…这是一个明显的鸡和蛋的问题。您需要一个知道下一个版本号需要是什么的oracle。您必须提供一个,编写您自己的程序来修改一个包含该属性的小.cs文件,并根据您喜欢的规则对其进行修改。在预构建事件中运行它。请记住,[AssemblyFileVersion]是非常无用的,CLR会完全忽略它。它只是注释性的,当您查看文件属性时,可以在“详细信息”选项卡中看到它。仅此而已。这看起来可能就是答案,但我收到了一个错误:错误62编译转换:当前数据库中不存在名称“主机”context@LeaHayes,是否在第一行设置了hostspecific=true?糟糕,我不小心将同一行粘贴了两次。这很好用!你是个救命恩人:因为我需要FileVersion,所以我不得不稍微修改一下模板,但这很简单。@LeaHayes是的,这只是个想法,如何获得版本取决于你。您可以加载已编译的程序集,或发出web请求。没关系这看起来可能是答案,但我得到了一个错误:错误62编译转换:名称“主机”在当前数据库中不存在context@LeaHayes,是否在第一行设置了hostspecific=true?糟糕,我不小心将同一行粘贴了两次。这很好用!你是个救命恩人:因为我需要FileVersion,所以我不得不稍微修改一下模板,但这很简单。@LeaHayes是的,这只是个想法,如何获得版本取决于你。您可以加载已编译的程序集,或发出web请求。不管怎样