0

我有一个来自某个 3rd 方提供商的 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 组合,但没有任何效果。

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

4

3 回答 3

1

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

在此处输入图像描述

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

于 2013-11-08T21:49:10.003 回答
1

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

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

有关启用的详细信息,请参阅以下链接: 如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)

于 2013-11-10T03:53:27.770 回答
0

感谢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.

我在我的头上,所以我刚开始恐慌 - 谷歌搜索并跑过这个 SO 帖子,它告诉我将东西设置为CopyLocal=true. 谷歌搜索这意味着什么导致了一堆关于为什么这样做是邪恶和/或天才的黑白意见,所以我决定这是一个洗涤并将它设置为我的 dll。这没有效果,但后来我设置CopyLocal=true了这个 3rd 方工具附带的配套 dll,然后它突然开始工作了!

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

于 2013-11-12T16:47:21.133 回答