我想阅读,修改和写回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来读/写它。这是一个备份计划。只是看到了。 Project类上的Save()方法如果我无法加载现有的.csproj,我想我错过了一些东西.thx)
答案 0 :(得分:9)
我实际上找到了答案,希望能帮助别人:
我们应该使用ProjectCollection类的工厂方法,而不是创建一个新项目(...)并尝试.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")
答案 1 :(得分: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);
}
}