繁体   English   中英

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

[英]Modify programatically csproj files with Microsoft.Build.Evaluation (instead of Engine)

我想读取、修改和写回 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() 方法在项目类,如果我无法加载现有的 .csproj,我想我错过了一些东西。谢谢)

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

我们应该使用 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")

因为我不能评论:

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

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);
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM