Roslyn,MSBuildWorkspace 编译引用 .NetStandard 项目的 .NetStandard 项目抛出 "No value for RuntimeMetadataVersion found."
Roslyn, MSBuildWorkspace compiling a .NetStandard project referencing a .NetStandard project throws "No value for RuntimeMetadataVersion found."
使用以下项目创建解决方案。
一个 .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\Class1.cs(1,7):错误 CS0246:找不到类型或命名空间名称 'System'(是否缺少 using 指令或程序集引用?)
d:\test\roslyntest\Class1.cs(5,18):错误 CS0518:未定义或导入预定义类型 'System.Object'
d:\test\roslyntest\Class1.cs(5,18): 错误 CS1729: 'object' 不包含采用 0 个参数的构造函数
我的问题。
为什么在项目 2 中找不到基本 类 而在项目 1 中?
唯一的区别是项目 2 引用了另一个项目。
我missing/doing哪里错了?
要解决此问题,您需要执行以下步骤:
- 引用
Microsoft.Build.Locator
NuGet 包。
- 在创建
MSBuildWorkspace
之前调用 MSBuildLocator.RegisterDefaults();
- 确保您的应用程序 bin 文件夹中没有任何 Microsoft.Build.* 程序集(见下文)。
通过这些步骤,我能够正确构建 2 个项目。
这是从输出文件夹中删除文件的方法(将其添加到您的 .csproj 或使用 Visual Studio 中的 Post 构建步骤)。
<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>
使用以下项目创建解决方案。
一个 .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\Class1.cs(1,7):错误 CS0246:找不到类型或命名空间名称 'System'(是否缺少 using 指令或程序集引用?)
d:\test\roslyntest\Class1.cs(5,18):错误 CS0518:未定义或导入预定义类型 'System.Object'
d:\test\roslyntest\Class1.cs(5,18): 错误 CS1729: 'object' 不包含采用 0 个参数的构造函数
我的问题。 为什么在项目 2 中找不到基本 类 而在项目 1 中?
唯一的区别是项目 2 引用了另一个项目。
我missing/doing哪里错了?
要解决此问题,您需要执行以下步骤:
- 引用
Microsoft.Build.Locator
NuGet 包。 - 在创建
MSBuildWorkspace
之前调用 - 确保您的应用程序 bin 文件夹中没有任何 Microsoft.Build.* 程序集(见下文)。
MSBuildLocator.RegisterDefaults();
通过这些步骤,我能够正确构建 2 个项目。
这是从输出文件夹中删除文件的方法(将其添加到您的 .csproj 或使用 Visual Studio 中的 Post 构建步骤)。
<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>