.NET项目中CSharpScript.RunAsync触发StackOverflowException求助
核心问题
基于.NET Framework 4.7.2的复杂数据建模工具中,原本正常的宏功能(依赖Microsoft.CodeAnalysis.CSharp.Scripting 4.9.2)突然触发StackOverflowException,简化后的测试代码在新建项目中可正常运行,但原项目执行CSharpScript.RunAsync时立即报错。已尝试清理重建项目、重装NuGet包,问题未解决。
排查与解决办法
检查程序集绑定重定向配置
原项目可能存在Microsoft.CodeAnalysis系列组件的版本冲突。打开项目的App.config,确认是否包含正确的绑定重定向规则,确保所有CodeAnalysis相关程序集统一指向4.9.2版本。示例配置如下:<dependentAssembly> <assemblyIdentity name="Microsoft.CodeAnalysis" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.9.2.0" newVersion="4.9.2.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.9.2.0" newVersion="4.9.2.0" /> </dependentAssembly>若未自动生成该配置,手动添加后重新编译项目。
清理冲突的程序集引用
进入项目的NuGet包管理界面,检查是否同时引用了不同版本的Microsoft.CodeAnalysis相关组件,或同时存在NuGet引用与本地dll引用的情况。删除所有冲突引用后,重新安装4.9.2版本的Microsoft.CodeAnalysis.CSharp.Scripting包。排查全局程序集缓存(GAC)冲突
打开命令提示符,执行gacutil /l Microsoft.CodeAnalysis查看GAC中已安装的组件版本。若存在4.9.2以外的版本,且不影响其他项目,可移除该旧版本;或通过App.config的绑定重定向强制项目优先使用本地引用的版本。检查调试/发布模式差异
测试原项目在调试和发布模式下是否均触发异常。若仅调试模式异常,尝试禁用“启用.NET框架源代码步进”等调试选项后再运行测试。排查Globals类的潜在问题
原项目中的Globals类可能包含复杂属性或方法,导致脚本执行时出现递归调用。检查该类是否存在属性getter/setter中调用脚本逻辑、或循环引用等情况,简化类结构后测试。定位递归调用链
使用Visual Studio的“调用堆栈”窗口,查看StackOverflowException触发时的递归调用路径,确定是脚本引擎内部递归还是项目业务代码导致的循环调用,针对性修复。
内容的提问来源于stack exchange,提问作者steveo40

