如何在Roslyn分析器中使用OpenAIClient,解决DiagnosticScopeFactory相关异常?
解决Roslyn分析器中Azure.AI.OpenAI的System.Diagnostics.DiagnosticSource加载异常
这个FileNotFoundException不是安全机制阻止请求导致的,本质是程序集加载失败——Roslyn分析器运行在Visual Studio的宿主环境中,依赖解析逻辑和控制台应用存在差异,导致Azure.AI.OpenAI需要的System.Diagnostics.DiagnosticSource 6.0.0.0无法被找到。以下是具体解决方案:
1. 显式安装对应版本的依赖包
直接在你的Roslyn分析器项目中安装System.Diagnostics.DiagnosticSource 6.0.0版本的NuGet包:
Install-Package System.Diagnostics.DiagnosticSource -Version 6.0.0
或者通过NuGet包管理器搜索安装,确保版本与Azure.AI.OpenAI依赖的版本完全匹配。
2. 配置项目的依赖复制规则
在分析器项目的.csproj文件中添加以下配置,确保依赖程序集被复制到输出目录:
<ItemGroup> <PackageReference Include="System.Diagnostics.DiagnosticSource" Version="6.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup>
也可以全局开启锁定文件程序集复制,在项目文件中添加:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
3. 添加程序集绑定重定向
由于Visual Studio宿主环境可能存在版本冲突,新建或修改分析器项目的app.config文件,添加绑定重定向规则:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
4. 同步测试项目的依赖配置
如果异常是在单元测试中抛出的,需要确保测试项目也包含上述依赖配置,并且测试运行时能访问到System.Diagnostics.DiagnosticSource程序集。
为什么控制台应用正常?
控制台应用的依赖解析基于自身输出目录,所有依赖包都会被复制到输出路径,而Roslyn分析器作为Visual Studio的扩展组件,依赖程序集需要被正确部署到VS能加载的位置,或者通过绑定重定向让VS使用指定版本的程序集。
内容的提问来源于stack exchange,提问作者ChopSeo
相关产品推荐
相关产品推荐

