3

我的开发机器是Vista x64。

我正在使用 WCF Web 服务来构建连接到 oracle 10g 数据库的 Web 服务。

开始开发时,我无法在 32 位 Oracle.DataAccess.dll 上使用 VS2008 的内置 WCF 测试工具 [WCFTestClient],该工具会在您按 F5 [Go] 时启动,因为我在 Oracle 对象上收到 System.BadImageFormatException。因此,在我的开发环境中,我为引用的程序集切换到了 ODP.NET 64 位版本,效果很好。

我可以部署到我的本地 IIS [7],但前提是我使用 32 位 Oracle.DataAccess.dll。

我正在尝试部署到安装了 .NET 3.5 sp1 和 Oracle 10g 数据库的 Win2003 [IIS 6]。此服务器上的其他 Web 应用程序成功使用 oracle 连接。

如果我从 web.config 文件中删除对 Oracle.DataAccess 的所有引用,并确保我的 bin/ 文件夹中没有 Oracle.DataAccess.dll,我可以调出默认服务元数据页面 [s],但调用服务通过 SOAP 客户端会导致错误:

“无法加载文件或程序集 'Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342' 或其依赖项之一。系统找不到指定的文件。”

但是,如果我将 Oracle.DataAccess.dll 的副本放在我的 bin/ 文件夹中,我会得到:

“无法加载文件或程序集 'Oracle.DataAccess' 或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)”

尝试在 Web 浏览器中加载 .svc 页面时。

如果我将程序集引用添加到我的 web.config,我会收到配置错误:“无法加载文件或程序集 xxx”

我想我正在寻求了解程序集缓存的帮助,以及具有 ODP.net 经验的人,他们可以帮助我导航这个危险的领域并成功部署此服务。

4

3 回答 3

9

最近我遇到了类似的问题,发现System.BadImageFormatException是由指定目标平台Any/x64的项目引用了32位版本的Oracle.DataAccess引起的。在将项目设置为目标 x86 并配置 IIS 7 以启用 32 位应用程序(右键单击应用程序池 -> 高级设置...将“启用 32 位应用程序”设置为 true)之后,一切似乎都按预期工作. 此外,这里是一篇文章的链接,该文章解释了如何让 32 位和 64 位版本在不同的工作进程上运行,另一个这里解释了如何使用 IIS 6 让 32 位应用程序在 64 位上运行。

于 2010-06-04T19:47:09.603 回答
2

好的,我已经 [部分] 解决了它,但我仍然需要知道为什么这会导致错误。

我在本地计算机上安装了 ODP.NET 32 位,位于与 64 位安装不同的文件夹中。我将 VS 项目中的程序集引用更改为位于 odp.net/bin/2.x/ 文件夹中的 Oracle.DataAccess.dll。

现在 SOAP 消息不再抛出错误。

现在的问题变成了:为什么我在开发环境中选择的 dll 会驱动必须在生产环境中使用的 dll?我希望能够在 64 位上进行开发并部署到 32 位服务器,而不必在每次我想部署时都更改我的引用。

于 2009-12-10T21:27:24.730 回答
1

我的公司也遇到了同样的问题,由于没有更好的解决方案,我们不得不选择使用 32 位 dll。

据我们所知,Oracle 的 64 位 dll 专为 64 位构建。与使用“Any”的 dll 构建不同,它也不包含 32 位目标代码。这很好,除了 32 位 dll 似乎根本无法加载的额外问题,除非该项目是专门为 32 位构建的。

我们已经尝试了数十次 64/32 位 dll 和项​​目设置的迭代,除了 32 位 dll/32 位项目之外,我们完全无法让任何东西工作。最后,我们不得不继续推进这个项目,停止将时间投入到看似无休止的斗争中。

如果可能的话,我诚实的建议是评估替代数据库解决方案。我使用 Oracle 的经历非常痛苦。

否则,只需构建 32 位。它不应该引起任何问题。

于 2012-07-25T21:22:15.433 回答