It's a bad idea to copy single DLL's to different directories and hope it will work.
In general ODP.NET provider works only together with corresponding Oracle Client, i.e. in order to use ODP.NET 12 you must also install Oracle Client 12. Same applies for version 11 or 10.
Only exception is the ODP.NET Managed Driver, there you need only a single DLL (Oracle.ManagedDataAccess.dll).
Furthermore the architecture (32 bit vs. 64 bit) has to match.
In case you use OLEDB provider it's even not possible to have more than one provider installed (for each architecture) - unless you hack your system by manipulating PATH
variable and Registry all the time.
My proposal would be: Remove all Oracle Clients from your machine and install only one (or one per architecture) Oracle Client properly. It's very unlikely that an application works with one Oracle Client version only. It is also a good approach to install both 32bit and 64bit on one machine, follow this instruction to do it: Install Oracle x86 and X64 on one machine
In case you really need to test your application with different Oracle Client version, setup a couple of test-PC (maybe in a Virtual-Box) each with a different Client version. Otherwise it will be very challenging to handle it.
Update:
I think each (Unmanaged) ODP.NET version works only with according version of Oracle Client. Maybe by chance there are some combinations which work out but in general the versions should match.
I see two different solutions:
(1) Ask your client to install his Oracle Client including ODP.NET. He can choose the version, only the architecture (32 bit or 64 bit) has to match. Then you don't supply any ODP.NET with your application.
In your *.csproj
, resp. *.vbproj
file define your reference like this:
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
Attributes like Version=...
or processorArchitecture=...
are not required. Then your application should run with any Oracle/ODP.NET version.
Your customer can download ODP.NET provider from here: Oracle Data Access Components (ODAC) for Windows Downloads and install it on top of existing Oracle Client installation. In readme.txt
it says "The files of this zip file is NOT to be installed on top of an existing
Oracle Universal Installer (OUI) based Oracle Home installation.", however I don't see any reason why not doing it. It works well, you just have to carefully provide correct folder for existing Oracle installation and correct ORACLE_HOME
name and do not install dependencies.
(2) In your setup script/exe determine the Version of customer installed Oracle Client and copy according ODP.NET to customer machine.
In order to determine version of Oracle Client you can to search for file oci.dll
in folders provided by PATH
environment. oci.dll
is a normal .NET assembly, so you can read out the version easily.
For a proper installation of ODP.NET follow the file configure.bat
which is part of downloaded ODP.NET XCopy version. In my opinion this batch file is easy to understand.
Basically it does
1 - Copy file Oracle.DataAccess.dll
to target machine
2 - Copy different resource files *\Oracle.DataAccess.resources.dll
to target machen
3 - Add these DLL's to the GAC. This can be done by gacutil.exe
or OraProvCfg.exe
(included in downloader ZIP file) or your setup application provides this operation.
4 - Make a few Regristy entries. Newer ODP.NET versions write/read into HKLM\SOFTWARE\Wow6432Node\Oracle\ODP.NET
(for 32 bit), resp. HKLM\SOFTWARE\Oracle\ODP.NET
(for 64 bit). Older ODP.NET versions use HKLM\SOFTWARE\Oracle\KEY_{ORACLE_HOME_KEY}\ODP.NET\
(for 64 bit), resp HKLM\SOFTWARE\Wow6432Node\Oracle\KEY_{ORACLE_HOME_KEY}\ODP.NET\
(for 32 bit) instead
That's it, you should be able to include this in your setup.