我的开发机器是Vista x64。
我正在使用WCF Web服务来构建与oracle 10g数据库连接的Web服务。
当开发开始时,我无法使用在32位Oracle.DataAccess.dll上按F5 [Go]时启动的VS2008的内置WCF测试工具[WCFTestClient],因为我在上面获得了System.BadImageFormatException Oracle对象。所以在我的开发环境中,我为我引用的程序集切换到ODP.NET 64位版本,这非常有用。
我可以部署到我的本地IIS [7],但前提是我使用32位Oracle.DataAccess.dll。
我正在尝试部署到安装了.NET 3.5 sp1的Win2003 [IIS 6],并安装了Oracle 10g数据库。此服务器上的其他Web应用程序成功使用oracle连接。
如果我从web.config文件中删除对Oracle.DataAccess的所有引用,并确保我的bin /文件夹中没有Oracle.DataAccess.dll,我可以打开默认服务元数据页面[s],但是通过SOAP客户端调用服务会导致错误:
“无法加载文件或程序集'Oracle.DataAccess,Version = 10.2.0.100,Culture = neutral,PublicKeyToken = 89b483f429c47342'或其中一个依赖项。系统找不到指定的文件。”
但是,如果我在我的bin /文件夹中放入Oracle.DataAccess.dll的副本,我会得到:
“无法加载文件或程序集'Oracle.DataAccess'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)”
尝试在网络浏览器中加载.svc页面时。
如果我向web.config添加程序集引用,则会收到配置错误:“无法加载文件或程序集xxx”
我想我正在寻求帮助了解程序集缓存,以及有ODP.net经验的人可以帮助我导航这个危险的区域并成功部署此服务。
答案 0 :(得分:9)
最近我遇到了类似的问题,发现System.BadImageFormatException是由指定Any / x64目标平台的项目引用32位版本的Oracle.DataAccess引起的。将项目设置为目标x86和配置IIS 7以启用32位应用程序(右键单击应用程序池 - >高级设置...设置“启用32位应用程序”设置为true)一切似乎都在工作预期。此外,here是一篇文章的链接,该文章解释了如何在不同的工作进程上运行32位和64位版本,另一篇here解释了如何使用IIS 6在64位上运行32位应用程序
答案 1 :(得分:2)
好的我已经设法[部分]解决它,但我仍然需要知道为什么这会导致错误。
我在本地计算机上安装了ODP.NET 32位,位于64位安装的单独文件夹中。我将VS项目中的程序集引用更改为位于odp.net/bin/2.x/文件夹中的Oracle.DataAccess.dll。
现在,SOAP消息不再抛出错误。
现在的问题是:为什么我在开发环境中选择dll来驱动必须在生产环境中使用的dll?我希望能够在64位上进行开发并部署到32位服务器,而无需在每次要部署时更改我的引用。
答案 2 :(得分:1)
我的公司遇到了同样的问题,我们不得不采用32位dll来解决缺乏更好的解决方案。
从我们已经知道的情况来看,Oracle的64位dll专为64位而设计。与使用“Any”的dll构建不同,它也不包括32位对象代码。这样就行了,除了32位dll似乎无法加载所有的额外问题,除非该项目是专门为32位构建的。
我们尝试过64次/ 64位dll和项目设置的几十次迭代,除了32位dll / 32bit项目外,我们完全无法完成任何工作。最后,我们不得不继续推进该项目,并停止将时间投入到无休止的斗争中。
我诚实的建议是尽可能评估替代数据库解决方案。我对Oracle的经验非常非常痛苦。
否则,只需构建32位。它不应该导致任何问题。