dotnet / dotnet/msbuild

How do I use `Microsoft.Build` within my app to load a project?

Open
#2,839 4 comments 0 reactions 0 assignees View on GitHub
triaged
Dominant language
C#
Stars
5.5k
Forks
1.5k
Avg merge
1d 13h
Merged PRs (30d)
133

Description

I want to use the `Microsoft.Build` nuget package in a .NET Core app to load a project file. I do not have Visual Studio installed. I am only using the dotnet cli.

### Steps to reproduce

Project file
```xml


Exe
netcoreapp2.0



```

Directory contents:
```
/
- my-app.csproj
- Program.cs
```

Program.cs:
```csharp
using System;
using System.IO;
using Microsoft.Build.Evaluation;
using Microsoft.Build.Construction;

class Program
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Usage: dotnet behave ");
return;
}

var proj = new Project(Path.GetFullPath(args[0]));

Console.WriteLine(proj);
}
}
```

Command line
```
dotnet run ../other/other.csproj
```

### Expected behavior
I can load the CS project file

### Actual behavior

Initially:
```
Unhandled Exception: Microsoft.Build.Exceptions.InvalidProjectFileException: The SDK 'Microsoft.NET.Sdk' specified could not be found. /path/to/other/other.csproj
at Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(String errorSubCategoryResourceName, IElementLocation elementLocation, String resourceName, Object[] args) in E:\A\_work\17\s\src\Shared\ProjectErrorUtilities.cs:line 440
at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(String directoryOfImportingFile, ProjectImportElement importElement, List`1& projects, Boolean throwOnFileNotExistsError) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2412
at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImports(String directoryOfImportingFile, ProjectImportElement importElement) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2215
at Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2070
at Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 1006
at Microsoft.Build.Evaluation.Evaluator`4.Evaluate(ILoggingService loggingService, BuildEventContext buildEventContext) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 794
at Microsoft.Build.Evaluation.Project.Reevaluate(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2641
at Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2634
at Microsoft.Build.Evaluation.Project.Initialize(IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2711
at Microsoft.Build.Evaluation.Project..ctor(String projectFile, IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectCollection projectCollection, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 512
at Microsoft.Build.Evaluation.Project..ctor(String projectFile) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 410
at Program.Main(String[] args) in /path/to/my-app/Program.cs:line 16
```

After setting `MSBuildSDKsPath=/usr/local/share/dotnet/sdk/2.1.3/Sdks` and `MSBuildExtensionsPath=/usr/local/share/dotnet/sdk/2.1.3`:
```
Unhandled Exception: Microsoft.Build.Exceptions.InvalidProjectFileException: The imported project "/path/to/my-app/bin/Debug/netcoreapp2.0/Microsoft.CSharp.targets" was not found. Confirm that the path in the declaration is correct, and that the file exists on disk. /usr/local/share/dotnet/sdk/2.0.0/Sdks/Microsoft.NET.Sdk/Sdk/Sdk.targets
at Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(String errorSubCategoryResourceName, IElementLocation elementLocation, String resourceName, Object[] args) in E:\A\_work\17\s\src\Shared\ProjectErrorUtilities.cs:line 440
at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpression(String directoryOfImportingFile, ProjectImportElement importElement, StringunescapedExpression, Boolean throwOnFileNotExistsError, List`1& imports) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2641
at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(String directoryOfImportingFile, ProjectImportElement importElement, List`1& projects, Boolean throwOnFileNotExistsError) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2422
at Microsoft.Build.Evaluation.Evaluator`4.ExpandAndLoadImports(String directoryOfImportingFile, ProjectImportElement importElement) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2215
at Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2070
at Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 1109
at Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(String directoryOfImportingFile, ProjectImportElement importElement) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 2070
at Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(ProjectRootElement currentProjectOrImport) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 1175
at Microsoft.Build.Evaluation.Evaluator`4.Evaluate(ILoggingService loggingService, BuildEventContext buildEventContext) in E:\A\_work\17\s\src\Build\Evaluation\Evaluator.cs:line 794
at Microsoft.Build.Evaluation.Project.Reevaluate(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2641
at Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(ILoggingService loggingServiceForEvaluation, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2634
at Microsoft.Build.Evaluation.Project.Initialize(IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 2711
at Microsoft.Build.Evaluation.Project..ctor(String projectFile, IDictionary`2 globalProperties, String toolsVersion, String subToolsetVersion, ProjectCollection projectCollection, ProjectLoadSettings loadSettings) in E:\A\_work\17\s\src\Build\Definition\Project.cs:line 512
at Microsoft.Build.Evaluation.ProjectCollection.LoadProject(String fileName, IDictionary`2 globalProperties, String toolsVersion) in E:\A\_work\17\s\src\Build\Definition\ProjectCollection.cs:line 1122
at MSBuildDumper.Main(String[] args) in /path/to/my-app/Program.cs:line 18
```

### Environment data
`dotnet --version`: 2.1.3

OS info: Mac

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the my-app.csproj and Program.cs files, then reproduce the reported behavior with dotnet run on the sample project. Review the Microsoft.Build project-loading path and the two reported SDK/import errors; done means the supported behavior or required configuration is established and documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.