Как реально изменить язык вывода / сообщений MSBuild?

TL; DR: Возможно ли с MSBuild для Visual Studio 2015 изменить язык сообщений MSBuild в командной строке, используя прямой подход вместо того, чтобы возиться с системными настройками? И как?


У нас есть вопрос "тогда", который по сути является дубликатом, но ИМХО ответы показывают, что вопрос нуждается в уточнении.

Мне нужно, чтобы это работало для VS2015 и выше, поэтому я не слишком обеспокоен старыми версиями.

Итак, вот некоторые факты:

  • Googling не показывает никакой опции командной строки MSBuild, которая изменила бы язык выходных сообщений.
  • Использование MSBuild из командной строки в немецкой системе даст мне немецкие сообщения об ошибках.
  • Использование английской Visual Studio в той же системе для вызова MSBuild сделает MSBuild (фактическим MSBuild.exe как подтверждено из дерева процессов Process Explorer) вывод английских сообщений на немецкой системе!
    • Это подразумевает, что 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 об использовании английского в качестве языка другими способами.

Дополнительное примечание MSBuild вызывается из VS следующим образом: C:\Program Files (x86)\MSBuild\14.0\bin\MSBuild.exe /nologo /nodemode:1 /nodeReuse:true

Итак, как мне сказать MSBuild.exe что он должен выводить на английский? Я в порядке с любым подходом обертки или, возможно, с некоторой магией PowerShell ( хотя это кажется маловероятным), но я не согласен с необходимостью полагаться на настройки локали машины / пользователя для этого.

Кроме того, я нашел ветку MSDN, где ответ был - 8 лет назад - что VS может сделать это, потому что он устанавливает культуру пользовательского интерфейса - но если devenv может сделать это, потому что он вызывал msbuild.exe, я бы, хотя Я, вероятно, тоже могу: я просто понятия не имею, как.

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 использует язык системы Windows по умолчанию для вывода сообщений о сборке. В Windows 10 Enterprise вы можете изменить настройки языка системы:

  1. Пуск> Регион и настройки языка
  2. Язык: Измените язык отображения Windows на свой язык (например, английский (США)).
  3. Перезагрузка / повторный вход

Теперь ваш вывод MSBuild должен быть настроен на системный язык.

Другие вопросы по тегам