如何真正改变 MSBuild 输出/消息语言?
Posted
技术标签:
【中文标题】如何真正改变 MSBuild 输出/消息语言?【英文标题】:How to really change MSBuild output/messages language? 【发布时间】:2016-10-18 09:22:48 【问题描述】:TL;DR:是否可以使用 Visual Studio 2015 的 MSBuild 在命令行上更改 MSBuild 的消息语言使用直接方法而不是弄乱系统设置 ?怎么做?
我们有一个来自“过去”的question,它本质上是重复的,但恕我直言,答案表明问题需要改进。
我需要这个才能在 VS2015 及更高版本上工作,所以我不太关心旧版本。
所以,这里有一些事实:
谷歌搜索不显示任何 MSBuild command line 选项会改变输出消息的语言。 在德语系统上从命令行使用 MSBuild 会给我德语错误消息。 在同一系统上使用英语 Visual Studio 调用 MSBuild 将使 MSBuild(实际的MSBuild.exe
已从进程资源管理器进程树中确认)在德语系统上输出英文消息!
这意味着devenv.exe
能够驱动MSBuild.exe
使用不同的语言。
也就是说:
c:\temp\TestApp>msbuild TestApp.sln /t:rebuild /v:normal
Microsoft (R)-Buildmodul, Version 14.0.25420.1
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
Die Projekte in dieser Projektmappe werden nacheinander erstellt. Um eine parallele Erstellung zu ermöglichen, müssen Sie den Schalter "/m"
hinzufügen.
Der Buildvorgang wurde am 18.10.2016 11:06:33 gestartet.
Projekt "c:\temp\TestApp\TestApp.sln" auf Knoten "1", rebuild Ziel(e).
ValidateSolutionConfiguration:
Die Projektmappenkonfiguration "Debug|X64" wird erstellt.
Das Projekt "c:\temp\TestApp\TestApp.sln" (1) erstellt "c:\temp\TestApp\TestApp\TestApp.csproj" (2) auf Knoten "1", Rebuild Ziel(e).
CoreClean:
Die Datei "C:\temp\TestApp\TestApp\bin\x64\Debug\TestApp.exe.config" wird gelöscht.
...
GenerateBindingRedirects:
Keine vorgeschlagenen BindingRedirect-Einträge von ResolveAssemblyReferences.
GenerateTargetFrameworkMonikerAttribute:
Das Ziel "GenerateTargetFrameworkMonikerAttribute" wird übersprungen, da alle Ausgabedateien hinsichtlich der Eingabedateien aktuell sind.
CoreCompile:
...
来自devenv
:
c:\temp\TestApp>devenv.com /Rebuild "Debug|x64" TestApp.sln
Microsoft Visual Studio 2015 Version 14.0.25420.1.
Copyright (C) Microsoft Corp. All rights reserved.
1>------ Rebuild All started: Project: TestApp, Configuration: Debug x64 ------
1>Build started 18.10.2016 11:10:27.
1>CoreClean:
1> Deleting file "C:\temp\TestApp\TestApp\bin\x64\Debug\TestApp.exe.config".
...
1>CoreCompile:
...
显然,devenv 在这里驱动输出,但实际的 msbuild 消息是相同的,并且 devenv 将调用 MSBuild.exe 作为实际的子进程。
我已经检查了进程资源管理器:调用的 MSBuild.exe 没有指示正在使用的项目的任何命令行参数,也没有任何明显的环境变量集。所以似乎 devenv 正在通过其他方式“告诉”MSBBuild 使用英语作为语言。
旁注 MSBuild 是这样从 VS 调用的:C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe /nologo /nodemode:1 /nodeReuse:true
那么,怎么做我告诉MSBuild.exe
它应该是英文输出?我对任何包装器方法或某些 powershell 魔法 (though that seems unlikely) 都很好,但我不对此必须依赖机器/用户区域设置很好。
另外,我发现an MSDN thread 的答案是——8 年前——VS 可以做到这一点,因为它设置了 UI 文化——但如果 devenv 可以做到这一点,因为它被调用 msbuild.exe 我'虽然我可能也可以:我只是不知道怎么做。
【问题讨论】:
从文档中我们知道,msbuild 没有任何参数来设置显示语言。我们需要将您机器的系统区域设置为英语 (***.com/questions/22529464/…) @starain - 是的,HansPassant wrote that 两年前。我什至在问题中提到似乎没有开关。不代表有更好的办法,因为这个问题详细说明 VS 可以驱动MSBuild输出另一种语言。 在此处留下评论,以便有人搜索 devenv 的输出消息语言。 (谷歌搜索导致这里)。/LCID id
或 /L id
是 msdn 中的方式
@LouisGo - 您链接到的 /LCID
开关似乎适用于 devenv.exe
- 这个问题是关于 msbuild.exe
outside 的 Visual Studio。 (再次,也许你的意思是“..在这里评论某人搜索 devenv ..”)
嗨马丁,我的意思是 devenv。由于我搜索 devenv 但搜索引擎导致这里,我决定在这里发表评论。尽管与您的主要问题无关,但您的帖子使我相信 devenv 可以更改输出语言。您是否建议删除我的评论或更清楚?
【参考方案1】:
我最终得到了以下解决方案。真的不知道代码是否绝对正确(我不是 .NET 开发人员),但它运行 msbuild 并设置了“en-us”语言环境。
class Program : MarshalByRefObject
static void Main(string[] args)
var newDomain = AppDomain.CreateDomain("enUSDomain");
Program newProgram = (Program)newDomain.CreateInstanceAndUnwrap(
typeof(Program).Assembly.FullName,
typeof(Program).FullName);
newProgram.Execute(args);
public void Execute(string[] args)
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture =
new System.Globalization.CultureInfo("en-US");
byte[] bytes = File.ReadAllBytes("C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe");
Assembly assembly = Assembly.Load(bytes);
MethodInfo main = assembly.EntryPoint;
main.Invoke(null, new object[] );
【讨论】:
以上是关于如何真正改变 MSBuild 输出/消息语言?的主要内容,如果未能解决你的问题,请参考以下文章
OmniSharp.MSBuild.ProjectManager 无法在 Linux 上加载项目
在 devenv 和 msbuild 中使用 CruiseControl.net 时输出二进制文件的任何差异