I would like to read, modify and write back csproj files. I've found this code, but unfortunately Engine class is depreciated.

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

So I've continued based on the hint I should use Evaluation.ProjectCollection instead of 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

There is no Load method anymore. I've tried to set the property FullPath, but the project still seems empty. Missed I something?

(Please note I do know that the .csproj file is a standard XML file with XSD schema and I know that we could read/write it by using XDocument or XmlDocument. That's a backup plan. Just seeing the .Save() method on the Project class I think I missed something if I can not load an existing .csproj. thx)

有帮助吗?

解决方案

I've actually found the answer, hopefully will help others:

Instead of creating a new Project(...) and trying to .Load(...) it, we should use a factory method of the ProjectCollection class.

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

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

其他提示

Since i can't comment:

This won't work in .net core without first setting the MSBuild.exe path variable. The code to do so can be found here

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

and is written here

 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归因
不隶属于 StackOverflow
scroll top