1

プログラムで MSBuild を使用して Visual Studio .csproj をパッケージ化しようとしています (名前空間 Microsoft.Build.Evaluation を使用)。次のようなコマンドでこのプロジェクトを正しくパッケージ化できます

    MSBuild "C:\Users\Documents\Visual Studio 2010\Projects\TestMvc\TestMvc\TestMvc.csproj" /T:Package

しかし、次のコードを使用すると (独自のロガーを実装しましたが、ここでは問題ありません):

            var project = new Microsoft.Build.Evaluation.Project(@"C:\Users\Documents\Visual Studio 2010\Projects\TestMvc\TestMvc\TestMvc.csproj");

            var logger = new OutputLogger(_panel);
            List<Microsoft.Build.Framework.ILogger> loggers = new List<Microsoft.Build.Framework.ILogger>();
            loggers.Add(logger);
            var targets = new string[] 
            { 
                "Package"

            };
            var result = project.Build(targets, loggers);
    Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.UnloadProject(project);

ソリューションがビルドされていません。Logger で「出力ファイル "obj\Debug\TestMvc.dll" が存在しません」というエラーが表示されます。

このプロジェクトを Visual Studio で手動でビルドした後 (すべてのバイナリが正常にビルドされたとき)、このコードはプロジェクトを正常にパッケージ化します。したがって、すべての必要なバイナリが既に利用可能です。

問題は、プログラムによって起動された「パッケージ」ターゲットがコマンドラインによって起動された「パッケージ」と等しくない理由と、前者にコマンドのような対応するものと同じアクションを強制する方法です。

アップデート。 何が起こっているかを確認するために、両方のケースで診断出力を有効にしました。私が得たもの:コンソールコマンドは次のログを生成しました:

Target "CoreCompile: (TargetId:37)" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets" from project "D:\Users\Documents\Visual Studio 2010\Projects\MvcTest2\MvcTest3\MvcTest3.csproj" (target "Compile" depends on it):
Building target "CoreCompile" completely.
Output file "obj\Debug\MvcTest3.dll" does not exist.
Using "Csc" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Csc" (TaskId:20)
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe .....
  Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1 (TaskId:20)
  Copyright (C) Microsoft Corporation. All rights reserved. (TaskId:20)
   (TaskId:20)
Done executing task "Csc". (TaskId:20)

API から呼び出すと、次のログが表示されました。

Target "CoreCompile" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets":
Building target "CoreCompile" completely.
Output file "obj\Debug\MvcTest3.dll" does not exist.
Using "Csc" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Csc"
Done executing task "Csc".

そのため、どちらの場合も Csc タスクが起動されますが、API によって起動された場合、出力ファイルは生成されません (ファイル モニターでも確認しましたが、ファイルは生成されません)。

4

0 に答える 0