【问题标题】:Modify programatically csproj files with Microsoft.Build.Evaluation (instead of Engine)使用 Microsoft.Build.Evaluation(而不是 Engine)以编程方式修改 csproj 文件
【发布时间】:2014-04-09 09:13:34
【问题描述】:

我想读取、修改和写回 csproj 文件。 我找到了这段代码,但不幸的是 Engine 类已被贬值。

Engine engine = new Engine()
Project project = new Project(engine);
project.Load("myproject.csproj");
project.SetProperty("SignAssembly", "true");
project.Save("myproject.csproj");

所以我继续根据我应该使用 Evaluation.ProjectCollection 而不是 Engine 的提示:

var collection = new ProjectCollection();
collection.DefaultToolsVersion = "4.0";
var project = new Project(collection);

// project.Load("myproject.csproj") There is NO Load method :-(
project.FullPath = "myproject.csproj"; // Instead of load? Does nothing...

// ... modify the project
project.Save(); // Interestingly there is a Save() method

不再有 Load 方法。我尝试设置属性 FullPath,但该项目似乎仍然是空的。错过了什么?

(请注意,我确实知道 .csproj 文件是具有 XSD 架构的标准 XML 文件,并且我知道我们可以使用 XDocument 或 XmlDocument 读取/写入它。这是一个备用计划。只要看到 .Save() Project 类上的方法我想如果我无法加载现有的 .csproj,我错过了一些东西。thx)

【问题讨论】:

    标签: c# msbuild projects-and-solutions csproj


    【解决方案1】:

    其实我已经找到答案了,希望能帮助到其他人:

    我们应该使用 ProjectCollection 类的工厂方法,而不是创建一个新的 Project(...) 并尝试 .Load(...) 它。

    // Instead of:
    // var project = new Project(collection);
    // project.FullPath = "myproject.csproj"; // Instead of load? Does nothing...
    
    // use this:
    var project = collection.LoadProject("myproject.csproj")
    

    【讨论】:

    • 是否可以将构建工件放到自定义文件夹中?
    【解决方案2】:

    因为我不能评论:

    如果不先设置 MSBuild.exe 路径变量,这将无法在 .net 核心中工作。可以在此处找到执行此操作的代码

    https://blog.rsuter.com/missing-sdk-when-using-the-microsoft-build-package-in-net-core/

    写在这里

     private static void SetMsBuildExePath()
            {
                try
                {
                    var startInfo = new ProcessStartInfo("dotnet", "--list-sdks")
                    {
                        RedirectStandardOutput = true
                    };
    
                    var process = Process.Start(startInfo);
                    process.WaitForExit(1000);
    
                    var output = process.StandardOutput.ReadToEnd();
                    var sdkPaths = Regex.Matches(output, "([0-9]+.[0-9]+.[0-9]+) \\[(.*)\\]")
                        .OfType<Match>()
                        .Select(m => System.IO.Path.Combine(m.Groups[2].Value, m.Groups[1].Value, "MSBuild.dll"));
    
                    var sdkPath = sdkPaths.Last();
                    Environment.SetEnvironmentVariable("MSBUILD_EXE_PATH", sdkPath);
                }
                catch (Exception exception)
                {
                    Console.Write("Could not set MSBUILD_EXE_PATH: " + exception);
                }
            }
    

    【讨论】:

    • 你的意思是 g.pickardou 的答案在不设置 MSBuild.exe 路径的情况下将不起作用?
    • 我猜是这样,但我对 Microsoft.Build.Evaluation 的内部运作了解不多,无法确定。我所知道的是,这显然不是一个问题,但我和 Rico Suter link 都曾在 .Net Core 项目中遇到过这个问题,并且错误消息谈到了“指定的 SDK 'Microsoft.NET.Sdk' 不能被找到。'
    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多