Search code examples
c#msbuildprojects-and-solutionscsproj

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


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)


Solution

  • 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")