【问题标题】:Could not load file or assembly Microsoft.CodeAnalysis.CSharp, Version=1.0.0.0 when deploying only仅部署时无法加载文件或程序集 Microsoft.CodeAnalysis.CSharp,版本 = 1.0.0.0
【发布时间】:2019-04-30 07:02:35
【问题描述】:

我有一个带有 asp.net Web 应用程序项目和一个类库项目的 Visual Studio 解决方案。

当我在 Visual Studio 中调试应用程序时,应用程序运行良好,但是当我使用 WebDeploy 部署它时,加载页面时出现以下异常:

System.IO.FileLoadException:
Could not load file or assembly 'Microsoft.CodeAnalysis.CSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

部署到文件夹时也会发生这种情况。

我的 Web 项目引用 Microsoft.CodeAnalysis.CSharp 版本 3.0.0,通过 Nuget 安装,我可以在包文件夹中看到它。 Web.config 包含以下内容:

<dependentAssembly>
  <assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>

超级困惑 - 我在任何地方都看不到任何 1.0.0.0 引用,我不知道我应该如何解决这个问题。我什至尝试在当前版本旁边手动安装 Microsoft.CodeAnalysis.CSharp 1.0.0.0 版,但没有任何变化。

编辑:

好的,所以这似乎可以通过在部署时关闭“发布期间预编译”选项关闭来解决。犹豫要不要回答我自己的帖子,因为我怀疑这不是一个真正的解决方案。

【问题讨论】:

  • 您是在 Debug 还是 Release 模式下部署项目?并且你在构建之后看到bin文件夹中对应的dll了吗?如果是,那么检查 dll 的版本,你实际上有什么版本?
  • @Leon 谢谢,它处于发布模式,现在不确定版本,但关闭“发布期间预编译”选项至少可以阻止此错误..

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


【解决方案1】:

如果您使用的是旧版本的 Microsoft.CodeDom.Providers.DotNetCompilerPlatform nuget,您可以更新它并再次尝试部署。

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 也引用了Microsoft.CodeAnalysis.CSharp

【讨论】:

  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform 似乎在最新的稳定版 2.0.1 上,但我会进一步研究。
  • 这些软件包版本似乎是正确的。关闭“发布期间的预编译”可以让我成功发布,但我知道这可能不是一个合适的解决方案。
【解决方案2】:

有几个不同的原因会导致这种排序输出,其中一个主要原因是主项目(在您的情况下为 Web 应用程序)没有对相关 dll 的特定引用,并且您假设构建和部署管道将正确地将所有依赖项目的输出中的所有 dll 直接提取到部署包中。

在附属程序集中使用 nuget 引用时,它们不会自动复制。主项目需要部署脚本中的特定指针才能知道从哪里获取正确的 dll。

对于相同的解决方案,您可能会在某些开发盒上遇到此问题,而在其他开发盒上则不会,或者当您比较卫星项目和您正在部署的 Web 项目的 dll 输出时,您会发现 Web 项目具有不同版本的依赖的dll

  1. 确保将安装在附属项目中的 所有 nuget 包安装到主 Web 项目中。

    • 这有助于 nuget 包管理器检测依赖项之间的冲突并自动管理可能需要的绑定重定向语句。
  2. 确保主项目中安装了卫星项目中相同版本的包。

    • 安装软件包后,您可以使用 Consolidate 界面来检测和解决版本不匹配问题。
      • 版本不匹配是我们最终要避免的问题。

如果以上所有内容都正确,那么您应该查看 web.config 中的绑定重定向。这可能会涉及到,而是先从reinstalling all the nuget packages 开始。

这可以工作,因为 nuget 包的安装脚本会自动设置绑定重定向,这可能是您组合依赖项所必需的

  1. 如果assemblyBinding 节点已经存在,请从 web.config 中删除它。重新开始。

  2. npm:(其中MyProject你的 web 项目的名称)

    update-Package -ProjectName MyProject -reinstall 
    

这应该可以解决问题!

ASP.NET Web 项目和其他具有内置部署管道的项目比其他项目类型更容易出现这些问题。只有依赖项目中编译的 dll 被直接复制到部署项目的输出中,其他依赖项的任何 nuget 引用都应在部署项目中解析,否则如果 GAC 中有类似的命名程序集,它们将被使用.

使用强命名引用可以帮助避免这些问题,但如果您使用大量非强命名的 3rd 方程序集,这通常是更难实现的解决方案。


这对我来说是一次具有讽刺意味的经历,因为原因和解决方案与我在 SO 上的第一篇帖子相似:Azure package not including linked project DLL even with copy local set 它的味道略有不同,但我现在应该更清楚了!

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多