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

Mar*_* Ba 6 .net msbuild uiculture visual-studio-2015

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

\n\n
\n\n

我们有一个“很久以前”的问题,本质上是重复的,但恕我直言,答案表明这个问题需要改进。

\n\n

我需要它在 VS2015 及更高版本上工作,所以我不太关心旧版本。

\n\n

所以,这里有一些事实:

\n\n
    \n
  • 谷歌搜索没有显示任何 会更改输出消息语言的MSBuild 命令行选项。
  • \n
  • 在德国系统上从命令行使用 MSBuild 会给出德语错误消息。
  • \n
  • 在同一系统上使用英语 Visual Studio 调用 MSBuild将使MSBuild(从进程资源管理器进程树中确认的实际值MSBuild.exe)在德语系统上输出英语消息!\n\n
      \n
    • 这意味着devenv.exe能够驾驶MSBuild.exe使用不同的语言。
    • \n
  • \n
\n\n

以机智:

\n\n
c:\\temp\\TestApp>msbuild TestApp.sln /t:rebuild /v:normal\n\nMicrosoft (R)-Buildmodul, Version 14.0.25420.1\nCopyright (C) Microsoft Corporation. Alle Rechte vorbehalten.\n\nDie Projekte in dieser Projektmappe werden nacheinander erstellt. Um eine parallele Erstellung zu erm\xc3\xb6glichen, m\xc3\xbcssen Sie den Schalter "/m"\nhinzuf\xc3\xbcgen.\nDer Buildvorgang wurde am 18.10.2016 11:06:33 gestartet.\nProjekt "c:\\temp\\TestApp\\TestApp.sln" auf Knoten "1", rebuild Ziel(e).\nValidateSolutionConfiguration:\n  Die Projektmappenkonfiguration "Debug|X64" wird erstellt.\nDas Projekt "c:\\temp\\TestApp\\TestApp.sln" (1) erstellt "c:\\temp\\TestApp\\TestApp\\TestApp.csproj" (2) auf Knoten "1", Rebuild Ziel(e).\nCoreClean:\n  Die Datei "C:\\temp\\TestApp\\TestApp\\bin\\x64\\Debug\\TestApp.exe.config" wird gel\xc3\xb6scht.\n  ...\nGenerateBindingRedirects:\n  Keine vorgeschlagenen BindingRedirect-Eintr\xc3\xa4ge von ResolveAssemblyReferences.\nGenerateTargetFrameworkMonikerAttribute:\nDas Ziel "GenerateTargetFrameworkMonikerAttribute" wird \xc3\xbcbersprungen, da alle Ausgabedateien hinsichtlich der Eingabedateien aktuell sind.\nCoreCompile:\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

和来自devenv

\n\n
c:\\temp\\TestApp>devenv.com /Rebuild "Debug|x64" TestApp.sln\n\nMicrosoft Visual Studio 2015 Version 14.0.25420.1.\nCopyright (C) Microsoft Corp. All rights reserved.\n1>------ Rebuild All started: Project: TestApp, Configuration: Debug x64 ------\n1>Build started 18.10.2016 11:10:27.\n1>CoreClean:\n1>  Deleting file "C:\\temp\\TestApp\\TestApp\\bin\\x64\\Debug\\TestApp.exe.config".\n...\n1>CoreCompile:\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,devenv 驱动此处的输出,但实际的 msbuild 消息是相同的,并且 devenv 将调用MSBuild.exe 作为实际的子进程

\n\n

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

\n\n

旁注 MSBuild 是从 VS 调用的,如下所示:C:\\Program Files (x86)\\MSBuild\\14.0\\bin\\MSBuild.exe /nologo /nodemode:1 /nodeReuse:true

\n\n

那么,我怎么知道MSBuild.exe应该是英文输出呢?我对任何包装方法或某些 powershell 魔法都很好(尽管这似乎不太可能),但我不喜欢必须依赖机器/用户区域设置来实现这一点。

\n\n

另外,我还找到了一个 MSDN 线程,其中的答案是 - 8 年前 - VS 可以做到这一点,因为它设置了 UI 区域性 - 但如果 devenv 可以做到这一点,因为它调用了 msbuild.exe 我\虽然我可能也可以:我只是不知道如何。

\n

pur*_*ess 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[] { });
    }
}
Run Code Online (Sandbox Code Playgroud)