问题从另一个项目加载程序集

时间:2013-11-08 21:37:58

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

我有来自第三方提供商的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 vs x86和其他奇特场景的问题,但我不确定我的情况是否适用于此。可以肯定的是,我在两个项目上尝试了x86 / x64 /任何cpu的所有可能组合,但没有效果。

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

3 个答案:

答案 0 :(得分:1)

问题很可能是由于您的计算机或您配置IIS的方式。最有可能的是,当IIS正在整理您的网站时,您的两个库会发生冲突。尝试检查您的应用程序池并查看“常规”部分。我在下面列出了一张图片:

enter image description here

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

感谢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设置为真。这没有效果,但是我为这个第三方工具附带的伴侣dll设置了CopyLocal=true,然后它突然开始工作了!

我不确定部分绑定究竟意味着什么,或者如何绕过它,或者是否有更好的方法,但这似乎可以解决问题。如果最终出现任何负面影响,我会在这里跟进。