【发布时间】:2018-10-05 17:38:16
【问题描述】:
我正在使用 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 上下文和迁移的项目中。 Microsoft.Build.Framework 版本 15 在两个项目中都作为参考列出,并自动设置为 Copy Local。
我尝试将我的 Web 应用程序中引用的版本更改为 4.0.0.0,它最初将 Copy Local 设置为 false。没有帮助。将 4.0.0.0 引用更改为 Copy Local。这一次,我遇到了一个错误:
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>
因此,考虑到 4.0.0.0 在 GAC 中,并且考虑到有一个重定向,我相信它会将任何 4.0.0.0 引用重定向到 15.1.0.0,为什么我会收到关于无法找到 4.0.0.0 的错误?有什么我想念的吗?我认为这一定与 aspnet_compiler.exe 在发布时所做的事情有关,因为我可以在我的开发机器上构建和测试该应用程序。
【问题讨论】:
-
我相信我已经尝试了该线程中的所有内容,除了将版本 15 添加到 gac 之外,该答案表明这更像是一种解决方法而不是解决方案。虽然当我回到我的电脑时我可能会尝试这样做。该线程似乎也是添加迁移的步骤。我已经过了那个阶段。
-
好吧,我想将版本 15 添加到 gac 是解决方案。但是有 MSFT 员工说“请不要在你的 GAC 中安装 Microsoft.Build.*”,这让我觉得有些东西需要修复。
-
有同样的问题......在我的开发机器上运行,但是当我部署时,它失败了。 @Dan 你有什么消息可以解决这个问题吗?
-
只有我上面提到的,就是把它安装到GAC中。然后在我升级到 Visual Studio 之后,它坏了,我认为这就是 MS 员工说不要这样做的原因。必须从 GAC 卸载,然后重新安装。那是在我的开发机器上,这是我唯一构建的地方。我有另一个人为该项目设置 CI/CD,但他没有提到有这个问题。
标签: c# asp.net entity-framework visual-studio-2017