4

TL;DR : Visual Studio 2015 の MSBuild を使用して、システム設定をいじる代わりに直接的なアプローチを使用して、コマンド ラインで MSBuild のメッセージ言語を変更することは可能ですか? そしてどうやって?


「昔」からの質問がありますが、これは本質的に重複していますが、私見の回答は、質問を洗練する必要があることを示しています。

これは VS2015 以降で動作する必要があるため、古いバージョンにはあまり関心がありません。

したがって、ここにいくつかのファクトイドがあります:

  • グーグルでは、出力メッセージの言語を変更するMSBuild コマンド ラインオプションは表示されません。
  • ドイツ語のシステムでコマンド ラインから MSBuild を使用すると、ドイツ語のエラー メッセージが表示されます。
  • 同じシステムで英語のビジュアル スタジオを使用して MSBuild を呼び出すMSBuild.exe、MSBuild (プロセス エクスプローラーのプロセス ツリーから確認され た実際のもの) がドイツ語のシステムで英語のメッセージを出力します。
    • これは、別の言語を使用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マジックで問題ありませんが(それはありそうにないようですが)、これをマシン/ユーザーのロケール設定に依存する必要があることには問題ありません。

また、答えが-8年前-UIカルチャを設定するため、VSがこれを実行できるというMSDNスレッドを見つけました-しかし、devenvがこれを実行できる場合、msbuild.exeが呼び出されるため、私もおそらくできます。方法がわかりません。

4

1 に答える 1

2

私は以下の解決策に行き着きました。コードが完全に正しいかどうかはよくわかりませんが (私は .NET 開発者ではありません)、「en-us」ロケールを設定して msbuild を実行します。

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[] { });
    }
}
于 2016-12-19T14:15:24.653 に答える