ASP.NET Core 2.0基于.NET Framework 4.6.1发布时缺失Microsoft.CSharp.dll
我之前也碰到过一模一样的情况——ASP.NET Core 1.1升2.0后本地跑完全正常,一发布到服务器就报这个错。本质是2.0针对.NET Framework项目的发布逻辑做了调整,默认不再输出ref文件夹,而你的应用依赖了引用程序集,服务器上又缺少对应的环境,所以才会触发这个异常。给你几个靠谱的解决办法:
方法一:强制发布时复制引用程序集
打开你的项目文件(.csproj),在<PropertyGroup>节点里添加下面这行配置:
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
保存后重新执行dotnet publish,你会发现消失的ref文件夹又回来了,服务器上的错误也会随之消失。这个配置能让发布行为回到1.1的模式,把需要的引用程序集一起打包进去,不用依赖服务器上的开发环境。
方法二:确保服务器安装了完整的.NET Framework 4.6.1开发包
如果不想修改项目配置,那得检查服务器上的.NET Framework是不是完整的。很多人只装了运行时,但引用程序集是包含在开发包里的(默认路径是C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1)。去微软官网下载.NET Framework 4.6.1的开发包重新安装,就能补上缺失的引用程序集。
方法三:确认项目的目标框架配置正确
先检查你的.csproj里的目标框架是不是明确设为net461,别写错版本:
<TargetFramework>net461</TargetFramework>
有时候不小心把目标框架改成其他版本,也会导致引用程序集的路径匹配错误,这个细节很容易被忽略。
补充说明
ASP.NET Core 2.0针对.NET Framework项目做了发布优化,默认不复制引用程序集,因为官方假设服务器上已经部署了对应的.NET Framework开发环境。但实际很多生产服务器只有运行时,所以就会出现这种找不到引用程序集的情况。而1.1版本默认会把这些文件打包进去,所以之前没碰到问题。
内容的提问来源于stack exchange,提问作者Praneeth

