Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中引用Oracle.DataAccess的正确版本_C#_.net_Oracle_Dll_Reference - Fatal编程技术网

C# 在.NET中引用Oracle.DataAccess的正确版本

C# 在.NET中引用Oracle.DataAccess的正确版本,c#,.net,oracle,dll,reference,C#,.net,Oracle,Dll,Reference,我试图从一个.NET 4.0项目中引用Oracle.DataAccess,该项目是在Visual Studio 2013上编写的。我的机器的GAC安装了两个版本的Oracle.DataAccess:Oracle版本11gr2提供的4.112.1.2和Oracle版本12c提供的4.121.2.0 我想引用版本4.112.1.2我的项目必须运行时将%ORACLE_HOME%设置为11gr2的安装位置,在这种情况下,引用4.121.2.0会导致运行时失败。我的机器上没有管理员帐户,所以我不能卸载12

我试图从一个.NET 4.0项目中引用Oracle.DataAccess,该项目是在Visual Studio 2013上编写的。我的机器的GAC安装了两个版本的Oracle.DataAccess:Oracle版本11gr2提供的4.112.1.2和Oracle版本12c提供的4.121.2.0

我想引用版本4.112.1.2我的项目必须运行时将%ORACLE_HOME%设置为11gr2的安装位置,在这种情况下,引用4.121.2.0会导致运行时失败。我的机器上没有管理员帐户,所以我不能卸载12c dll

我尝试了以下步骤来强制可执行文件在运行时加载4.112.1.2 dll:

使用强名称引用my.csproj文件中的dll:

正在更新my App.Config文件以强制重定向:

我已经阅读了微软关于程序集绑定和应用的文档。我也读过StackOverflow的答案,这些答案似乎与我的问题有关,但没有任何效果

如何强制.NET在运行时从GAC加载正确的DLL版本

编辑:

Wernfried的回答让我觉得我可能看错了。下面是正在发生的事情:

我用ORACLE\u HOME=C:\ORACLE\ora12c运行我的应用程序,一切正常,数据库访问成功,应用程序很高兴

我使用所需版本的ORACLE\u HOME=C:\ORACLE\ora11gr2运行应用程序。应用程序崩溃,但出现以下异常:

Oracle.DataAccess.Client.OracleException ORA-12557: TNS:protocol adapter not loadable.
<stacktrace follows>

在stacktrace之后,我发现在我的应用程序创建数据库连接的调用中发生了错误。我已经检查了我的连接字符串,并确认它是正确的,并且它是与12c成功连接的同一个连接字符串。然后我发现我调用的Oracle.DataAccess dll的版本是12c版本,而不是11gr2版本。由此,我得出结论,我需要修改调用来加载dll,以强制11gr2。如果我找错人了,请告诉我

据我所知,ODP.NET提供程序4.112.1.2仅适用于Oracle客户端11.2。ODP.NET提供程序4.121.2.0需要Oracle 12.1客户端

您的计算机上是否安装了两个版本的Oracle客户端

为了使用其中一个,还必须相应地设置PATH环境变量。路径必须包含要在应用程序中使用的Oracle客户端二进制文件的文件夹

注意,应用程序、Oracle客户端和ODP.NET提供程序的体系结构(即32位与64位)必须完全相同

但是为什么您喜欢强制使用ODP.NET的特定版本呢?我建议使用此参考

<Reference Include="Oracle.DataAccess">
  <SpecificVersion>False</SpecificVersion>
  <Private>False</Private>
</Reference>
必须像这样重新编写:

var DLL = default(Assembly);
DLL = Assembly.LoadFrom(@"C:\Path\To\11gr2\Oracle.DataAccess.dll");
// resp for GAC:
// DLL = Assembly.Load(String.Format("Oracle.DataAccess, Version={0}.{1}.*.*, Culture=neutral, PublicKeyToken=89b483f429c47342", 1, 112));    
var type = DLL.GetType("Oracle.DataAccess.Client.OracleConnection", true, false);
using ( dynamic con = Activator.CreateInstance(type, connString) ) {
    con.Open();
    ...
 }

我想我已经修好了

让它对我起作用的是取消ORACLE_HOME环境变量的设置,并将C:\Path\to\11gr2\bin放在路径的开头,如下所示:

set PATH=C:\Path\to\11gr2\bin;%PATH%

是的,我的机器上安装了两个客户端。我试图通过set path=C:\path\to\11gr2\bin;%手动将11gr2客户端放在我的路径上运行前的路径%,但没有更改。我还尝试了您推荐的在项目中设置引用的方法,但没有改变。关于你关于不强制发布版本的评论,我已经更新了我的问题,我试图将“C:\Path\to\11gr2”与你的路径联系起来
using (OracleConnection con = new OracleConnection(connString))
{
    con.Open();
    ...
}
var DLL = default(Assembly);
DLL = Assembly.LoadFrom(@"C:\Path\To\11gr2\Oracle.DataAccess.dll");
// resp for GAC:
// DLL = Assembly.Load(String.Format("Oracle.DataAccess, Version={0}.{1}.*.*, Culture=neutral, PublicKeyToken=89b483f429c47342", 1, 112));    
var type = DLL.GetType("Oracle.DataAccess.Client.OracleConnection", true, false);
using ( dynamic con = Activator.CreateInstance(type, connString) ) {
    con.Open();
    ...
 }
set PATH=C:\Path\to\11gr2\bin;%PATH%