在.NET中无法加载Oracle.DataAccess的文件或程序集

29

当我尝试运行一个简单的访问oracle的程序时,我收到以下信息:

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

我检查了\windows\assembly目录,它在那里,但是它不在GAC中(gacutil -l)。我无法添加到GAC(gacutil -i [path])。我收到“未知错误”。

有人有同样的经验吗?


4
因为我使用的是x64,只需使用x86来运行就可以解决问题。 - Chris
4
你应该提供一个更完整的答案,然后标记你找到的解决方案来回答你的问题。 - Doug Porter
13个回答

25
我将从我刚刚经历的Windows Server 2008 R2 64位操作系统中为您提供答案。我得到了使用旧DLL库开发的.net 3.5 x86应用程序库,但我卡住了,因为我安装了来自Oracle的更新的x64客户端。
我发现以下内容: 在Windows Server 2008上安装最新的Oracle x64客户端。我认为这将是2.7.0客户端。选择安装时,请确保进行自定义并选择.NET库。 配置您的tnsnames文件并测试针对数据源的tnsping。
接下来,如果您运行32位应用程序,请安装32位客户端的相同版本。还要遵循相同的安装程序,并选择相同的主目录。
完成后,您将发现您有一个具有两个客户端目录(Client1和Client2)的单个应用程序/产品。
如果您导航到windows / assemblies目录,您将发现您引用了Oracle.DataAccess.dll(x2),其中一个为x86,另一个为AMD64。
现在,根据您是否有开发人员或者自己在该机器上开发,您可能会没问题,但是如果他们使用较旧的驱动程序,则需要执行最后一步。
导航到app \ name \ product \ version \ client_1 \ odp.net \ publisher policy \ 2.x目录。包括这里的两个策略文件。使用gacutil / i将Policy.2.111.Oracle.DataAccess.dll安装到GAC中。这将重定向遗留的Oracle ODP调用到更新版本。因此,如果有人使用10g客户端进行开发,则现在可以与11客户端一起使用。
FYI-有些人可能正在安装带有2.111.7.20的最新ODP.NET。主要的Oracle客户端本身配备有2.111.7.0..我没有成功使用7.20,但是使用7.0客户端没有问题。

1
非常感谢!这篇文章救了我! - mamashare

8

我之前在x64编译,只需使用x86即可解决问题。


1
我希望你能提供更多的信息。我遇到了这个问题,现在卡住了。 - Pascal
2
是的,你可以说这样做解决了问题,但在x64编译没有任何问题,我想以这种方式运行它,在我的计算机上有大量的Oracle.DataAccess.dll和Oracle客户端,现在我所能做的就是为x86编译。Oracle出了问题!!! - mkb
1
@mkb 我同意。不幸的是,Oracle还没有解决这个问题。 - Lucas B

4
解决方案非常简单,只需要正确定义服务器/工作站上的内容与Visual Studio项目相关即可。
首先检查您正在使用的Oracle库的版本,在您的情况下为2.111.7.20。接下来转到位于Windows主目录->程序集文件夹中的Windows GAC。
向下滚动到Oracle dll,通常称为Oracle.DataAccess或Oracle.Web。找到正确的版本,并注意它是否为x86或AMD64。
在Visual Studio中确保目标平台与GAC中的dll相同,因此如果在GAC文件夹中显示为x86,请确保目标平台为x64和其他x64。您可以在Visual Studio项目属性下的生成/平台目标中设置此选项。
还要确保您的项目引用(在项目的“引用”下)指向开发计算机上完全相同的版本。
有了这一切,一切都应该正常工作。
我通常会先检查服务器,因为在企业环境中更改本地依赖项的版本通常比要求服务器管理员安装不同的dll更容易。

3

我曾经遇到过同样的问题。

解决方法是将我的当前解决方案平台更改为x64。

在Visual Studio中进行操作,右键单击解决方案>配置管理器>活动解决方案平台。


3

如第一个答案所提到的,32/64位场景会给开发人员带来构建和运行时的问题。

解决方案始终是尝试正确:安装了什么类型的软件和操作系统。

有关使用Oracle驱动程序的一小部分场景及其解决方案,请访问此post


2
在我的情况下,错误提示为该程序集。
Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342

缺失。

当我运行gacutil.exe /l 'Oracle.DataAccess'时,结果为:

The Global Assembly Cache contains the following assemblies:
Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86

Number of items = 1

此时,我刚刚安装了Oracle客户端:win32_11gR2_client

然后我安装了Oracle开发人员工具ODTwithODAC112030_deleloper_tool

现在gacutil报错:

The Global Assembly Cache contains the following assemblies:
Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86
Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86

Number of items = 2

修复了一个完全丢失的装配案例


2
请尝试以下步骤:在Visual Studio中,转到"工具/选项"...."项目和解决方案"..."Web 项目"...确保勾选了"IIS Express的64位版本"复选框。

2
在您的 .net 项目中,转到引用部分,右键单击 Oracle.DataAccess dll,进入属性。
将设置更改为 "Specific Version=False"。现在就不会有版本冲突了。

1
我曾经遇到同样的问题几天,后来我发现项目的引用列表中有Oracle.DataAccess,但在bin文件夹中却没有。所以我将其从引用列表中删除,然后重新添加。

1
我转而使用了 Oracle 的托管 ODP.NET 程序集。我还不得不清除所有使用旧程序集的 IIS Web 应用程序中的文件。现在,当我在 IIS Express 和 IIS 中进行调试时,我不会再遇到关于 32 位与 64 位版本冲突的问题。请参见以下文章。

.NET 的轻松驱动


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接