【问题标题】:issues loading assembly from another project从另一个项目加载程序集的问题
【发布时间】:2013-11-08 21:37:57
【问题描述】:

我有一个来自某个第 3 方提供商的 dll。我从我的 MVC 项目中引用了它,一切正常。

我决定将所有使用该 dll 的代码提取到一个单独的项目中。然后我从我的 MVC 项目中删除了对 dll 的引用,而是引用了我的另一个项目,即该 api 的包装器/抽象。

现在,我在服务器尝试加载时收到以下错误:

Could not load file or assembly 'xxxx' or one of its dependencies. An attempt was made to load a program with an incorrect format.

我在这个网站和其他地方看到了很多关于 x64 与 x86 以及其他看似奇异的场景的问题,但我不确定我的情况是否适用于此。可以肯定的是,我在这两个项目上尝试了所有可能的 x86/x64/any cpu 组合,但没有任何效果。

我在这里遗漏了什么,或者我做错了什么?

【问题讨论】:

  • 好的,我们有项目 A B 和 C,A 引用 B,B 引用 C,在运行时,你能验证 C dll 存在于运行 A 的库中吗?如果您不确定打印到控制台运行 A 的进程所在的目录,然后用您的眼睛看到 C dll 放置在那里
  • B 和 C dll 都存在于进程运行 A 的目录中。我不知道这是否重要,但这是一个与另一个 dll 相伴的 dll,并且似乎与 i18n 相关。配套 dll 不会被复制到 A 目录。

标签: c# asp.net asp.net-mvc-4 iis dll


【解决方案1】:

问题很可能是由于您的机器或您配置 IIS 的方式造成的。很可能当 IIS 正在后台处理您的站点时,您的两个库会发生冲突。尝试检查您的应用程序池并查看“常规”部分。我在下面添加了一张图片:

如果第三方库是严格 32 位编译的,而您的服务器是 64 位的,则需要确保将此选项设置为 true。

【讨论】:

  • 我的高级设置看起来与您的相同(名称除外),我试图引用的 dll 是 64 位的,我的服务器也是如此。只是为了好玩,我尝试引用 32 位版本的 dll,结果相同
【解决方案2】:

您可以尝试使用程序集绑定日志查看器获取更多信息。

http://msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx

有关启用的详细信息,请参阅以下链接: How to enable assembly bind failure logging (Fusion) in .NET

【讨论】:

    【解决方案3】:

    感谢the suggestion by Zephryl,我得到了以下程序集绑定日志:

    LOG: User = IIS APPPOOL\DefaultAppPool
    LOG: DisplayName = Laserfiche.I18n83
     (Partial)
    WRN: Partial binding information was supplied for an assembly:
    WRN: Assembly Name: Laserfiche.I18n83 | Domain ID: 5
    WRN: A partial bind occurs when only part of the assembly display name is provided.
    WRN: This might result in the binder loading an incorrect assembly.
    WRN: It is recommended to provide a fully specified textual identity for the assembly,
    WRN: that consists of the simple name, version, culture, and public key token.
    WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.
    

    我有点不知所措,所以我刚开始恐慌地谷歌搜索并遇到this SO post,它告诉我将内容设置为CopyLocal=true。谷歌搜索这意味着什么导致了一堆关于为什么这样做是邪恶和/或天才的黑白意见,所以我决定这是一个洗礼,并将它设置为我的 dll。这没有效果,但后来我为这个 3rd 方工具附带的配套 dll 设置了CopyLocal=true,然后它突然开始工作了!

    我不确定部分绑定的确切含义,或者如何绕过它,或者是否有更好的方法,但这似乎可以解决问题。如果最终有任何负面影响,我会在这里跟进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多