MVC Core项目部署后无法加载System.Linq.Dynamic.Core程序集怎么办
MVC Core部署后System.Linq.Dynamic.Core加载异常排查方案
本地运行正常、部署后报程序集找不到,按以下顺序逐一排查即可:
报错信息:Could not load file or assembly 'System.Linq.Dynamic.Core, Version=1.2.6.0'. The system cannot find the file specified.
- 先检查发布配置的裁剪逻辑
如果发布时选了独立部署模式,直接把「裁剪未使用的程序集」选项关掉。这个裁剪功能对动态加载的程序集识别准确率很低,非常容易把实际在用的Linq.Dynamic.Core直接裁掉,不会输出到发布目录。如果选的是框架依赖模式,先确认服务器装的.NET运行时版本和本地开发用的SDK大版本完全对齐,不要出现本地用.NET 6开发、服务器只装.NET 3.1运行时的情况。 - 核对NuGet包的引用属性
打开项目的.csproj文件,找到System.Linq.Dynamic.Core对应的PackageReference节点,确认节点上没有加<Private>false</Private>、<ExcludeAssets>all</ExcludeAssets>这类配置。这类配置会明确告诉构建过程不要把这个dll复制到输出目录,本地调试可能因为缓存存在能正常跑,发布的时候就会丢文件。正常的引用行只需要保留包名和版本号即可,不需要额外属性。 - 直接核对发布输出目录的文件
本地执行Release发布后,先打开publish输出文件夹搜System.Linq.Dynamic.Core.dll:- 本地publish目录里就找不到这个dll:不要用VS的可视化发布功能,直接在项目根目录开命令行执行
dotnet publish -c Release,命令行发布不会受VS里存的自定义发布配置影响,能排除UI配置错误导致的文件漏输出。 - 本地publish目录有dll,服务器上找不到:大概率是文件传输漏了,不要零散拖拽dll上传,把整个publish目录打包成zip压缩包,传到服务器后整包解压,避免FTP或者远程桌面文件传输跳过部分文件。
- 本地publish目录里就找不到这个dll:不要用VS的可视化发布功能,直接在项目根目录开命令行执行
- 排查版本绑定冲突
如果服务器部署目录里已经存在该dll还是报错,就在本地项目根目录执行dotnet list package --include-transitive,查看所有传递依赖里有没有引用其他版本的System.Linq.Dynamic.Core。如果存在多版本冲突,要么把所有关联依赖的版本统一到1.2.6.0,要么在csproj里加程序集绑定重定向,指定运行时统一加载1.2.6.0版本。 - 核对服务器部署配置
IIS部署场景下,检查对应应用程序池的「启用32位应用程序」选项,和本地发布时选的平台目标(x86/x64/Any CPU)保持一致,位宽不匹配时系统会直接返回找不到文件的错误。同时给部署目录给IIS运行账号分配读取、执行权限,权限不足时很多场景不会直接报权限错误,也会提示找不到指定文件。
内容的提问来源于stack exchange,提问作者tenzin yeshi
相关产品推荐
相关产品推荐

