首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET 6控制台应用程序中加载.NET 6项目

如何在.NET 6控制台应用程序中加载.NET 6项目
EN

Stack Overflow用户
提问于 2022-08-13 23:43:34
回答 1查看 57关注 0票数 2

我试图在.NET 6控制台应用程序中加载.NET 6项目(SDK样式)。我的整个项目相当简单--当它从默认的输出文件夹运行时,它实际上尝试加载自己的.csproj文件:

代码语言:javascript
复制
using Microsoft.Build.Evaluation;

namespace ProjLoading
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var projectLocation = "../../../ProjLoading.csproj";
            var project = new Project(projectLocation, null, null, new ProjectCollection());
        }
    }
}

我使用以下nuget软件包:

  • Microsoft.Build (17.2.0)
  • Microsoft.Build.Utilities.Core (17.2.0)

当我运行代码时,我会得到以下异常:

代码语言:javascript
复制
Microsoft.Build.Exceptions.InvalidProjectFileException: 'The SDK 'Microsoft.NET.Sdk' specified could not be found.  C:\Users\vchel\source\repos\ProjLoading\ProjLoading\ProjLoading.csproj'

This exception was originally thrown at this call stack:
    Microsoft.Build.Shared.ProjectErrorUtilities.ThrowInvalidProject(string, Microsoft.Build.Shared.IElementLocation, string, object[])
    Microsoft.Build.Evaluation.Evaluator<P, I, M, D>.ExpandAndLoadImportsFromUnescapedImportExpressionConditioned(string, Microsoft.Build.Construction.ProjectImportElement, out System.Collections.Generic.List<Microsoft.Build.Construction.ProjectRootElement>, out Microsoft.Build.BackEnd.SdkResolution.SdkResult, bool)
    Microsoft.Build.Evaluation.Evaluator<P, I, M, D>.ExpandAndLoadImports(string, Microsoft.Build.Construction.ProjectImportElement, out Microsoft.Build.BackEnd.SdkResolution.SdkResult)
    Microsoft.Build.Evaluation.Evaluator<P, I, M, D>.EvaluateImportElement(string, Microsoft.Build.Construction.ProjectImportElement)
    Microsoft.Build.Evaluation.Evaluator<P, I, M, D>.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement)
    Microsoft.Build.Evaluation.Evaluator<P, I, M, D>.Evaluate()
    Microsoft.Build.Evaluation.Project.ProjectImpl.Reevaluate(Microsoft.Build.BackEnd.Logging.ILoggingService, Microsoft.Build.Evaluation.ProjectLoadSettings, Microsoft.Build.Evaluation.Context.EvaluationContext)
    Microsoft.Build.Evaluation.Project.ProjectImpl.ReevaluateIfNecessary(Microsoft.Build.BackEnd.Logging.ILoggingService, Microsoft.Build.Evaluation.ProjectLoadSettings, Microsoft.Build.Evaluation.Context.EvaluationContext)
    Microsoft.Build.Evaluation.Project.ProjectImpl.Initialize(System.Collections.Generic.IDictionary<string, string>, string, string, Microsoft.Build.Evaluation.ProjectLoadSettings, Microsoft.Build.Evaluation.Context.EvaluationContext)
    Microsoft.Build.Evaluation.Project.Project(string, System.Collections.Generic.IDictionary<string, string>, string, string, Microsoft.Build.Evaluation.ProjectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings, Microsoft.Build.Evaluation.Context.EvaluationContext, Microsoft.Build.FileSystem.IDirectoryCacheFactory)
    ...
    [Call Stack Truncated]

我正在从Visual 2022 (17.2.2)构建/运行这个控制台应用程序。

我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2022-08-14 00:03:01

我不明白为什么,但我遇到了这个解决方案,它解决了这个问题:

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

如果链接在将来失效,我的整个项目现在将环境变量MSBUILD_EXE_PATH设置为msbuild的最新版本,如下面的代码所示:

代码语言:javascript
复制
using Microsoft.Build.Evaluation;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace ProjLoading
{
    internal class Program
    {
        static void Main(string[] args)
        {
            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);

            var projectLocation = "../../../ProjLoading.csproj";
            var project = new Project(projectLocation, null, null, new ProjectCollection());
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73348274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档