使用Roslyn编译.NET 6简单项目失败,求解决方法
问题
尝试使用Roslyn编译一个简单的.NET 6项目但失败,操作步骤如下(已安装.NET 6且c:\temp目录存在):
- 创建目录:
mkdir c:\temp\TestLib - 创建
TestLib.csproj文件,内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> </Project>
- 创建
SomeClass.cs文件,内容:
namespace TestLib { public class SomeClass { void DoThings() { Console.WriteLine("Things!"); } } }
- 进入目录:
cd c:\temp\TestLib - 执行
dotnet build,构建成功 - 创建目录:
mkdir c:\temp\RoslynTrouble - 创建
RoslynTrouble.csproj文件,内容:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Build.Locator" Version="1.5.5" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0" /> <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.8.0" /> </ItemGroup> </Project>
- 创建
Program.cs文件,内容:
using Microsoft.Build.Locator; using Microsoft.CodeAnalysis.MSBuild; class TestProgram { public static async Task Main(string[] args) { string csprojPath = args[0]; var instance = MSBuildLocator.RegisterDefaults(); Console.WriteLine(instance.Name + ": " + instance.Version); var workspace = MSBuildWorkspace.Create(); var project = await workspace.OpenProjectAsync(csprojPath); var compilation = await project.GetCompilationAsync(); if (compilation == null) { Console.WriteLine("Error: unexpected null compilation"); return; } foreach (var diagnostic in compilation.GetDiagnostics()) { Console.WriteLine(diagnostic); } } }
- 进入目录:
cd c:\temp\RoslynTrouble - 执行
dotnet run c:\temp\TestLib\TestLib.csproj
预期结果:无编译错误
实际结果:出现大量编译错误,部分错误如下:
.NET Core SDK: 6.0.203 c:\open\prototypes\TestLib\obj\Debug\net6.0\TestLib.GlobalUsings.g.cs(2,1): error CS0116: A namespace cannot directly contain members such as fields or methods c:\open\prototypes\TestLib\SomeClass.cs(7,13): error CS0103: The name 'Console' does not exist in the current context
解决方案
核心问题
- Roslyn版本不兼容:使用的
Microsoft.CodeAnalysis包版本3.8.0对应.NET 5,不支持.NET 6的ImplicitUsings特性,导致自动生成的全局using文件无法被正确解析,触发CS0116错误。 - 程序集引用缺失:旧版本Roslyn加载.NET 6项目时,无法自动引入
System.Console所在的程序集,引发CS0103错误。
修复步骤
- 升级Roslyn相关包:将
RoslynTrouble.csproj中的包版本更新为支持.NET 6的版本,推荐使用与.NET 6 SDK匹配的版本(如4.1.0),同时升级Microsoft.Build.Locator到兼容的稳定版:
<ItemGroup> <PackageReference Include="Microsoft.Build.Locator" Version="1.6.1" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.1.0" /> <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.1.0" /> </ItemGroup>
- 刷新依赖:进入
RoslynTrouble目录,执行以下命令确保包更新生效:
dotnet clean dotnet restore
- 可选:添加错误监听:如果仍有问题,可给
MSBuildWorkspace添加日志监听,排查加载过程中的异常,修改Program.cs:
var workspace = MSBuildWorkspace.Create(); workspace.WorkspaceFailed += (sender, e) => Console.WriteLine($"Workspace error: {e.Diagnostic.Message}");
验证
重新执行dotnet run c:\temp\TestLib\TestLib.csproj,此时应无编译错误,输出正常。
内容的提问来源于stack exchange,提问作者David Airapetyan
相关产品推荐
相关产品推荐

