Roslyn,MSBuildWorkspace编译引用.NetStandard项目的.NetStandard项目会引发"没有找到RuntimeMetadataVersion的值。"

时间:2018-04-13 12:21:43

标签: c# roslyn .net-standard-2.0

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

.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:类型或命名空间名称'系统'找不到(你错过了使用指令或汇编引用吗?)

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

d:\ test \ roslyntest \ 2 \ Class1.cs(5,18):错误CS1729:' object'不包含带0参数的构造函数

我的问题。 为什么它没有找到项目2中的基本类,而是在项目1中?

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

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

1 个答案:

答案 0 :(得分:3)

要解决此问题,您需要采取以下步骤:

  1. 参考Microsoft.Build.Locator NuGet包。
  2. 在创建MSBuildLocator.RegisterDefaults();
  3. 之前致电MSBuildWorkspace
  4. 确保您的app bin文件夹中没有任何Microsoft.Build。*程序集(见下文)。
  5. 通过这些步骤,我能够正确地构建2个项目。

    这是如何从输出文件夹中删除文件(将其添加到.csproj或使用Visual Studio中的Post Build步骤)。

      <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

相关问题