网络发布找不到Microsoft.Build.Framework

时间:2018-10-05 17:38:16

标签: c# asp.net entity-framework visual-studio-2017

我正在将VS2017与我从另一个开发人员继承的ASP.NET项目一起使用。我已将发布功能设置为发布到文件夹。到目前为止,这一切一直很好。

以前的开发人员使用EntityFramework,尽管在获得项目时所有引用都被破坏了,所以我必须拼凑出哪个版本。我目前正在使用6.2.0,并且一切正常。他显然正在使用自动迁移功能。我继续使用此功能,但是在某些情况下必须启用数据丢失。我真的不想这样做,因此建议的路径是启用迁移并添加实际的迁移。我不是OR Mappers的新手,但是我是EF的新手,因此迁移对我来说是很新的。实际上,要使工作按文档规定的方式进行(这是this thread

因此,现在我要准备初始迁移数据。似乎下一步是将其发布到我们的开发服务器,然后再发布到生产服务器。因此,由于在此项目之前我已经多次使用了发布功能,所以我认为它可以正常工作。好吧,由于我为使EF迁移正常工作所做的更改,现在不是这种情况。

发布将一直执行到此:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p 
C:\Users\Dan\Documents\Source\Repos\web- 
app\WebApp\obj\Release\AspnetCompileMerge\Source -u 
C:\Users\Dan\Documents\Source\Repos\web- 
app\WebApp\obj\Release\AspnetCompileMerge\TempBuildDir 

/global.asax(1,0): Error ASPPARSE: Could not load file or assembly 
'Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system 
cannot find the file specified.

ASPNETCOMPILER(0,0): Error ASPRUNTIME: Could not load file or assembly 
'Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system 
cannot find the file specified.

让我惊讶的第一件事是,为了使迁移正常进行,我必须安装Microsoft.Build.Framework 15(特别是我使用nuget安装了15.1.1012,然后尝试将其更新为最新版本,现在是15.8.166)。看来这是同一库的不同版本,而不是巧合。

我看到一些需要编辑devenv.exe.config来将相对路径更改为绝对(here)的提示,但这没有帮助。

我在GAC中确认存在4.0.0.0。显然是14.0.0.0。据我了解,小于15的已安装版本应该在GAC中。

我确保Microsoft.Build.Framework(通过nuget)已添加到我的Web应用程序项目以及具有EF上下文和迁移的项目中(通过nuget)。在两个项目中都列出了Microsoft.Build.Framework的版本15作为参考,并自动设置为“本地复制”。

我尝试将Web应用程序中引用的版本更改为4.0.0.0,该版本最初将“本地复制”设置为false。没有帮助。将4.0.0.0参考更改为“本地复制”。这次,我遇到一个错误:

Could not load file or assembly 'Microsoft.Build.Framework, 
Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one 
of its dependencies. The located assembly's manifest definition does not 
match the assembly reference. (Exception from HRESULT: 0x80131040)

现在,我的想法是因为看起来好像涉及多个版本,所以也许应该使用绑定重定向来解决它。我很少需要处理绑定重定向,因此我不是专家,但是我确实查看了web.config,并且看起来有些东西(我假设是安装了Microsoft.Build.Framework 15的Nuget)以下:

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0" />
  </dependentAssembly>

因此,考虑到GAC中存在4.0.0.0,并且考虑到我认为会将4.0.0.0的任何参考重定向到15.1.0.0,为什么我会收到关于找不到4.0.0.0的错误消息?有什么我想念的吗?我认为这一定与aspnet_compiler.exe在发布中所做的事情有关,因为我可以在开发机器上正常地构建和测试应用。

3 个答案:

答案 0 :(得分:1)

我遇到了与OP所述完全相同的问题。

通过安装Microsoft Build Tools 2015

解决了问题

对我来说,问题是从VS 2015迁移到VS 2017之后发生的。但是,当尝试在VS 2017中发布在VS 2015中创建的项目时,我听到很少有人报告相同的情况。

答案 1 :(得分:0)

这是一个Microsoft软件包问题,Microsoft似乎正在逐步淘汰对较早版本的Nuget版本的支持。这个解决方案对我有用。问题消失了,现在可以成功构建了。

在您的Azure Build Pipeline> NuGet tool installer步骤中,将Version of NuGet.exe to install更改为较新的版本,例如5.4.0。

https://dist.nuget.org/tools.json上查看Nuget的最新ReleasedAndBlessed版本。

答案 2 :(得分:0)

在我的情况下,从web.config中删除bindingRedirect,然后为Microsoft.Build.Framework安装最新的nuget就像是一种魅力。