运行时引用Roslyn代码分析遇程序集加载失败如何解决?
问题描述
我希望在运行时通过Roslyn代码分析检查解决方案和项目,使用了以下代码:
MSBuildLocator.RegisterDefaults(); var workspace = MSBuildWorkspace.Create(); var sln = await workspace.OpenSolutionAsync(solutionPath);
项目的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.Extensions.Configuration.CommandLine" Version="7.0.0" /> <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.7.0" /> <PackageReference Include="Microsoft.Build.Locator" Version="1.4.1" /> </ItemGroup>
项目编译正常,但运行时抛出错误:
Could not load file or assembly 'Microsoft.CodeAnalysis.CSharp.Workspaces, Version=4.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified
已经尝试添加MSBuild Locator但无效,求解决办法。
解决办法
1. 显式添加缺失的包引用
Microsoft.CodeAnalysis.Workspaces.MSBuild 虽依赖相关组件,但偶尔会因传递性引用问题,导致Microsoft.CodeAnalysis.CSharp.Workspaces未被正确复制到输出目录。直接在csproj中显式添加该包引用,注意版本要与Microsoft.CodeAnalysis.Workspaces.MSBuild保持一致:
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.7.0" />
2. 清理重建并验证输出文件
- 执行命令清理项目并重新还原依赖:
dotnet clean && dotnet restore - 检查项目输出目录(如
bin/Debug/net6.0)下是否存在Microsoft.CodeAnalysis.CSharp.Workspaces.dll,若缺失,手动删除obj和bin目录后重新构建。
3. 确保MSBuild Locator调用时机正确
MSBuildLocator.RegisterDefaults()必须是程序启动后第一个执行的代码,要在任何Roslyn相关逻辑之前运行,示例如下:
static async Task Main(string[] args) { MSBuildLocator.RegisterDefaults(); var workspace = MSBuildWorkspace.Create(); var sln = await workspace.OpenSolutionAsync(solutionPath); // 后续业务逻辑 }
调用时机错误会导致MSBuild环境初始化异常,间接引发程序集加载失败。
4. 检查依赖版本兼容性
确认项目目标框架(net6.0)与Roslyn包版本兼容,4.7.0版本的Roslyn包支持net6.0。执行dotnet list package查看依赖树,排查是否存在其他包版本冲突导致的加载问题。
内容的提问来源于stack exchange,提问作者Darren Oakey

