使用Oracle.DataAccess引用部署C#控制台应用程序

时间:2011-10-21 14:44:22

标签: c# .net oracle oracle11g

我一直在尝试部署我对服务器进行的c#控制台应用程序。我基本上已经将Release文件夹的内容复制到服务器上,除了Oracle之外,一切似乎都很顺利。在我的开发机器(32位XP)上,我有OracleClient 11.2,而服务器(64位服务器2008)有11.1。如果我从本地计算机上运行它,该应用程序就可以运行。

当我通过复制Release文件夹并尝试运行应用程序进行部署时,出现以下错误:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.
File name: 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342'
   at PDV.AODGateway.StoredProcedures..ctor()
   at PDV.AODGateway.AODGateway.Export()
   at PDV.AODGateway.AODGateway.Main(String[] args)

(不要过多地阅读它来寻找111.7版本。它说因为我尝试在app.config中指定寻找那个版本。之前它说它找不到112.1)

它失败的代码部分是我创建OracleConnection对象的部分。

如果我尝试将dll从服务器复制到部署文件夹中,我会收到类似的错误:

Unhandled Exception: System.TypeInitializationException: The type initializer for 'PDV.AODGateway.StoredProcedures' threw an exception. ---> System.BadImageFormatException: Could not load file or assembly 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342'
   at PDV.AODGateway.StoredProcedures..cctor()

我最终通过将这些文件从我的开发机器上的oracleclient文件夹(即我用来构建解决方案的机器)复制到服务器上应用程序的目录中来解决问题:

Oracle.DataAccess.dll
oci.dll
OraOps11w.dll
oraociei11.dll

然而,这似乎是非常糟糕的做法,所以你们有没有关于我如何能够做到这一点的建议?你们有没有遇到过这个问题?

1 个答案:

答案 0 :(得分:7)

我之前使用Oracle数据访问组件运行了类似的问题。我的猜测是你在控制台应用程序的构建配置中使用AnyCPU平台目标构建了你的.exe。这意味着当它在32位开发机器上运行时,它将被加载到32位进程中,而在64位服务器上,它将被加载到64位进程中。问题是Oracle.DataAccess.dll组件有两种不同的版本,32位和64位版本。当您从开发计算机将32位版本复制到部署bin目录中时,在运行时,应用程序将尝试将显式标记为32位的程序集加载到64位进程中,该进程无效并解释了为什么会出现这种情况System.BadImageFormatException

因此,最好的解决方案可能是在控制台应用程序的项目设置中为发布配置明确定位64位平台,并引用64位版本的Oracle.DataAccess.dll。在服务器上,您需要在GAC中安装64位Oracle.DataAccess.dll(安装ODAC时可能已经安装),或者您需要在应用程序中部署64位程序集。

当你需要针对两个平台时,我发现这些东西很痛苦。