You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
解决方案

核心问题

  1. Roslyn版本不兼容:使用的Microsoft.CodeAnalysis包版本3.8.0对应.NET 5,不支持.NET 6的ImplicitUsings特性,导致自动生成的全局using文件无法被正确解析,触发CS0116错误。
  2. 程序集引用缺失:旧版本Roslyn加载.NET 6项目时,无法自动引入System.Console所在的程序集,引发CS0103错误。

修复步骤

  1. 升级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>
  1. 刷新依赖:进入RoslynTrouble目录,执行以下命令确保包更新生效:
dotnet clean
dotnet restore
  1. 可选:添加错误监听:如果仍有问题,可给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:05