如果程序要被大量部署,每次都要安装oracle客户端会非常麻烦。用odp.net开发就可以免去安装客户端。
odp.net 依赖的基本dll如下:
Oracle.DataAccess.dll,oci.dll,orannzsbb11.dll,oraociei11.dll,OraOps11w.dll
如何提取这些文件(以oracle11g为例)
首先安装 11g客户端管理员(运行时应该也可以),再安装(instance client)
文件名 目录
Oracle.DataAccess.dll (管理员安装目录)\odp.net\
oci.dll (管理员安装目录)\bin\
orannzsbb11.dll (管理员安装目录)\bin\
oraops11w.dll (管理员安装目录)\bin\
oraociei11.dll (instance client安装目录)\bin\
如何让你的程序能够同时支持64位
1.32位 和 64位的oracle客户端版本要一致,这样可以确保上面提到的5个dll版本是一致的,
尤其是32位和64位的Oracle.DataAccess.dll 的publickeytoken必须是一样的。
2.如果开发的时候引用的是32位程序集,编译64位的程序时要在config文件中添加程序集依赖
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess"
publicKeyToken="89B483F429C47342"
culture="neutral" />
<bindingRedirect
oldVersion="2.112.1.1"
newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
------------------------------------------------------------------------------
最近在部署的时候发现以上方法并不能成功的脱离Oracle客户端,在此向诸位读过此文从而产生误导的朋友表示真诚的道歉。
------------------------------------------------------------------------------
通过reflector反编译Oracle.DataAccess,查看进程依赖的dll,几经周折发现以上dll 还与如下几个文件关联:
msvcr80.dll,msvcp80.dll,msvcm80.dll,
Microsoft.VC80.ATL.manifest,Microsoft.VC80.CRT.manifest,Microsoft.VC80.ATL.manifest
还有一个疑问:在reflector中选择 MC++ 可以看到的 Oracle.DataAccess 源代码,可是导出后发现 类 没有具体的实现,包括用C#写的程序集 导出c++后文件里的类也是空的,不明原理,求知情者解答。
![](http://img.zemanta.com/pixy.gif?x-id=b680f874-cbfe-8166-8f50-9faa4523745b)