用Microsoft.Build.Evaluation(而不是Engine)以编程方式修改csproj文件

问题描述 投票:6回答:2

我想读取,修改和写回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,我想我会错过一些东西。]

c# msbuild projects-and-solutions csproj
2个回答
9
投票

我实际上已经找到了答案,希望能对其他人有所帮助:

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

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

// use this:
var project = collection.LoadProject("myproject.csproj")

0
投票

因为我无法发表评论:

如果不首先设置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);
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.