【问题标题】:Web publish can't find Microsoft.Build.FrameworkWeb 发布找不到 Microsoft.Build.Framework
【发布时间】: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


【解决方案1】:

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

问题已通过安装Microsoft Build Tools 2015解决

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

【讨论】:

    【解决方案2】:

    这是一个 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 版本。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        与 OP 一样,我参考了 Microsoft.Build.Framework v15,我发现只要确保 web.config 中没有 Microsoft.Build.Framework 程序集的程序集重定向,我的部署就可以工作。重定向会中断部署,因为我们执行 ASPNETCOMPILE 阶段以确保视图语法正确,并且构建中断并显示 OP 的错误消息。

        不幸的是,Visual Studio 20XX 喜欢用每个 nuget 操作默默地为它重新添加一个程序集重定向到我的 web.config,而且我必须在每次臭烘烘的时候将其删除,通常是在失败之后build 提醒我:

          <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>
        

        【讨论】:

        【解决方案5】:

        我的问题非常具体,但可能对某人有所帮助: 我正在使用反射动态地执行一些操作,为此我正在加载这样的程序集:

            var types = AppDomain.CurrentDomain.GetAssemblies()
                    .SelectMany(s => s.GetTypes())
                    .Where(p => (typeof(IMandatorId).IsAssignableFrom(p) || typeof(INullableMandatorId).IsAssignableFrom(p))
                        && typeof(IEntityModel).IsAssignableFrom(p))
                    .ToList();
        

        但是,对于特定程序集,GetTypes() 方法会失败,在我的情况下,该程序集链接到特定的 nuget 包。我删除了包裹,东西又开始工作了。 对于那些感兴趣的包是:

        Microsoft.VisualStudio.Web.CodeGeneration
        

        在我将所有软件包升级到 .net 6 后问题开始出现

        【讨论】:

          猜你喜欢
          • 2020-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          相关资源
          最近更新 更多