0

我目前正在实施 WCF 服务,该服务与后端的 Oracle 10g 数据库通信。当我尝试从我的服务中连接到数据库时,出现以下异常:System.TypeInitializationException.

  • 我在 Windows 7(64 位机器)上运行。

  • 我正在使用 VS 2010。

  • 我在后端使用 Oracle 10g。

  • 我是来自以下已安装实例的 Oracle.DataAccess.dll (ODP.Net)

     c:\oracle\product\10.2.0\.....\ODP.NET\bin\1.x\Oracle.DataAccess.dll
    
  • 我已将此 DLL 包含在我的 WCF 服务的引用中。

  • 我已将此服务作为一个项目包含在我的 VS WPF 解决方案中。

  • 当我在 VS 2010 中启动 WPF 应用程序时,该服务会自动启动。

在运行时,我在调试输出窗口中看到以下输出:

'WcfSvcHost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\assembly\GAC\Oracle.DataAccess\1.102.2.20__89b483f429c47342\Oracle.DataAccess.dll' 'System.TypeInitializationException 类型的第一次机会异常'发生在 Oracle.DataAccess.dll

果然,我在调试器中查看异常详细信息,看到以下信息(当我尝试创建新的 ORACLE 连接时会出现这种情况):

“'Oracle.DataAccess.Client.OracleConnection' 的类型初始化程序引发了异常。” InnerException {“提供程序与 Oracle 客户端版本不兼容”} System.Exception {Oracle.DataAccess.Client.OracleException}

一点背景:

我基本上是将我的数据层迁移到 WCF 服务。相同的服务层以前存在于 WinForm 应用程序中。在我的 WinForm 应用程序中一切正常。我包含对 Oracle.DataAccess.dll 的相同引用,并且我对数据库的所有读/写操作都可以正常工作。

WCF 和 WinForm 对 DLL 的访问/使用之间是否存在明显不同?有一些我不知道的限制吗?在调试器中通过 VS2010 运行这个有问题吗?

我完全不知道这里发生了什么。任何提示/方向将不胜感激。

4

1 回答 1

1

不,您需要注意的 .NET 方面没有什么特别之处。
此特定错误的一些原因是:

  1. 您的应用程序以 .NET 4 为目标,但您只安装了用于 .NET 2 甚至 .NET 1 的 ODP.NET
  2. 您正在使用本地 Oracle Instant 客户端,但缺少一些非托管 DLL。

实际上,您的异常消息表明它试图从 GAC 加载版本号为 1.102.2.20 的 Oracle.DataAccess.dll。这似乎是 ODP.NET 的.NET 1版本,因为 .NET 2 的版本号为2 .102.2.20,而 .NET 4 的版本号为4 .102.2.20。

也许您的 Winforms 应用程序在其 bin 文件夹中有一个版本的 Oracle.DataAccess.dll 并且正在使用它而不是 GAC 中的那个版本?


这些问题是我在项目中切换到本地 Oracle Instant 客户端的原因。这为我的部署增加了 130 MB,但这并不重要,因为它都是公司软件。

于 2012-08-21T18:08:50.980 回答