How do I use `Microsoft.Build` within my app to load a project?
- 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