使用Visual Studio开发的.NET Framework ASP.NET MVC项目本地正常运行,代码签入后,其他同事从代码库签出后不能正常编译(Could not resolve this reference. Could not locate the assembly),项目下引用的不少类库上显示黄色的小三角,也就是找不到引用类库。判断这种情况应该是类库没有自动Restore,于是点击解决方案,右键Restore Nuget Packages手动修复,很快完成了,但是黄色的小三角并没有消除。打开项目文件夹发现packages.config下包含的libraries都已经恢复到和Solution文件同一目录的packages文件夹里了。很是奇怪。
打开csproj文件,仔细检查后发现了原因,原来项目文件在自己的目录下找packages文件夹,但是实际上解决方案恢复的packages文件夹在其上级目录,当然就找不到了。 哈哈,这才想起来,在上传代码的时候,觉得Solution文件放在project目录下不是很好,于是就把它拷贝到了外面,重新把项目文件加到解决方案里,自己把自己给坑了。。。
<Reference Include="Newtonsoft.Json"> <HintPath>packagesNewtonsoft.Json.12.0.2lib et45Newtonsoft.Json.dll</HintPath> </Reference> <Reference Include="System.Web.Optimization"> <HintPath>packagesMicrosoft.AspNet.Web.Optimization.1.1.3lib et40System.Web.Optimization.dll</HintPath> </Reference>
知道了原因自然就让容易解决,把packages文件夹拷贝到项目文件夹下,选中项目,右键Unload/Reload Project,问题解决了(有时候可能需要关闭重新打开解决方案)。 但是这样做只能是变通地解决问题,其他同事签出代码,还是需要手动去移动packages文件夹,这样不太好。解决办法是:要么在Visual Studio对应项目上手动删除再重新添加Libraries依赖,要么手动修改csproj里的包引用为相对路径,修改后的Libraries路径如下所示:
<Reference Include="Newtonsoft.Json"> <HintPath>..packagesNewtonsoft.Json.12.0.2lib et45Newtonsoft.Json.dll</HintPath> </Reference> <Reference Include="System.Web.Optimization"> <HintPath>..packagesMicrosoft.AspNet.Web.Optimization.1.1.3lib et40System.Web.Optimization.dll</HintPath> </Reference>
有没有更酷的解决方法呢?答案是有,打开ToolsNuget Package ManagerPackage Manager Console,可以使用以下Powershell命令自动完成重新安装,如下所示:
Update-Package -Reinstall
个人总结:.Net Framework项目,Nuget restore的packages文件夹总是和solution文件放同一个目录,项目文件(XXX.csproj)会按照相对路径去找相应的Libraries依赖,当solution文件移动到上级目录后,就会出现项目找不到Libraries依赖的情况,最好在刚开始就把solution文件保存到项目文件夹的上级目录。
更多参考:Stack overflow: Could not resolve this reference. Could not locate the assembly