Roslyn,MSBuildWorkspace 编译引用 .NetStandard 项目的 .NetStandard 项目时会抛出“找不到 RuntimeMetadataVersion 的值”。

2024-03-06

使用以下项目创建解决方案。

一个.NetStandard2.0项目,命名为“1”

一个.NetStandard2.0项目,命名为“2”

在2中添加项目1的引用

.Net4.6.1 控制台项目将其命名为“3”并添加 nuget Microsoft.CodeAnalysis.CSharp.Workspaces v2.7.0

将以下代码粘贴到项目3中

static void Main(string[] args)
    {
        string dir = Path.Combine(Environment.CurrentDirectory, "..\\..\\..\\");

        string solutionPath = Directory.GetFiles(dir, "*.sln").First();
        var msWorkspace = MSBuildWorkspace.Create();

        Solution solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;

        DateTime date = DateTime.UtcNow;
        foreach (var project in solution.Projects.Take(2))
        {
            Compilation compilation = project.GetCompilationAsync().Result;

            using (var dllStream = new MemoryStream())
            {
                var emitResult = compilation.Emit(dllStream);
                if (emitResult.Success)
                {
                    Console.WriteLine("Success");
                }
                else
                {
                    foreach (var err in emitResult.Diagnostics)
                    {
                        Console.WriteLine($"{err.ToString()}");
                    }
                }
            }
        }
        Console.Read();
    }

执行项目 3 会引发项目 2 的以下错误,但不会引发项目 1 的错误。

警告 CS8021:未找到 RuntimeMetadataVersion 值。找不到包含 System.Object 的程序集,也没有通过选项指定 RuntimeMetadataVersion 的值。

d:\test\roslyntest\2\Class1.cs(1,7): 错误 CS0246: 找不到类型或命名空间名称“System”(您是否缺少 using 指令或程序集引用?)

d:\test\roslyntest\2\Class1.cs(5,18):错误CS0518:未定义或导入预定义类型“System.Object”

d:\test\roslyntest\2\Class1.cs(5,18):错误CS1729:“对象”不包含采用0个参数的构造函数

我的问题。 为什么在项目 2 中找不到基础类,而在项目 1 中却找不到?

唯一的区别是项目 2 引用了另一个项目。

我错过了什么/做错了什么?


为了解决这个问题,您需要采取以下步骤:

  1. 参考Microsoft.Build.LocatorNuGet 包。
  2. Call MSBuildLocator.RegisterDefaults();在创建之前MSBuildWorkspace
  3. 确保应用程序 bin 文件夹中没有任何 Microsoft.Build.* 程序集(见下文)。

通过这些步骤,我能够正确构建这两个项目。

这是从输出文件夹中删除文件的方法(将其添加到 .csproj 或使用 Visual Studio 中的“生成后”步骤)。

  <PropertyGroup>
    <PostBuildEvent>del "$(TargetDir)\Microsoft.Build.dll"
del "$(TargetDir)\Microsoft.Build.Framework.dll"
del "$(TargetDir)\Microsoft.Build.Tasks.Core.dll"
del "$(TargetDir)\Microsoft.Build.Utilities.Core.dll"
    </PostBuildEvent>
  </PropertyGroup>

欲了解更多信息,请参阅:https://github.com/dotnet/roslyn/issues/26029 https://github.com/dotnet/roslyn/issues/26029

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Roslyn,MSBuildWorkspace 编译引用 .NetStandard 项目的 .NetStandard 项目时会抛出“找不到 RuntimeMetadataVersion 的值”。 的相关文章

随机推荐