如何真正改变MSBuild输出/消息语言?

时间:2016-10-18 09:22:49

标签: .net visual-studio-2015 msbuild uiculture

TL; DR :Visual Studio 2015的MSBuild是否可以使用直接方法在命令行上更改MSBuild的消息语言,而不是弄乱系统设置 ?怎么样?

我们从“当时的方式”中得到question这本质上是重复的,但恕我直言,答案显示问题需要改进。

我需要这个适用于VS2015及以上,所以我并不过分担心旧版本。

所以,这里有一些事实:

  • Google搜索没有显示任何会改变输出消息语言的 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作为实际的子进程

我已经使用Process explorer进行了检查:调用的MSBuild.exe没有任何命令行参数,指示正在使用的项目,也没有任何明显的环境变量集。因此,似乎devenv“告诉”MSBBuild通过其他方式使用英语作为语言。

旁注来自VS的MSBuild如下: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我可能也会这样:我不知道怎么做。

1 个答案:

答案 0 :(得分:2)

我最终得到了以下解决方案。不知道代码是否绝对正确(我不是.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[] { });
    }
}