已经在PC上使用Oracle.DataAccess.DLL,而不提供它

时间:2010-12-20 18:05:50

标签: c# oracle dll

我希望让我的程序更具活力。我希望能够使用相同的程序支持Oracle 10g和Oracle 11g数据库。如果我使用.DLL引用为一个版本构建程序,那么另一个版本失败。有没有办法使用已安装在计算机上的Oracle.DataAccess.DLL,而不是在我的安装程序中提供DLL?

提前致谢。

3 个答案:

答案 0 :(得分:6)

SpecificVersion是仅在构建期间应用的属性。它旨在帮助构建环境中有多个版本的程序集;当SpecificVersion为true时,它将确保您构建并引用所需的版本。但是,构建目标程序集后,其引用包含引用程序集的强名称和版本号。因此,如果SpecificVersion为false,那么它将被设置为引用当时构建环境中可用的引用版本。

“请注意,”特定版本“属性只是一个构建时指令,它对引用的程序集的运行时版本解析没有影响”(http://www.code-magazine.com/article.aspx? quickid = 0507041&安培;页= 3)

但是,您可以使用版本重定向来明确注释您接受任何版本。 oldVersion字段指定任何内容(您构建的版本),newVersion属性将指定您希望在运行时实际链接哪一个。

  <dependentAssembly>
    <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
    <bindingRedirect oldVersion="1.0.0.0-2.111.9999.9999" newVersion="2.102.2.20"/>
  </dependentAssembly>

(见http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx。)

dependentAssembly节点可以应用于不同的上下文。一个可能的上下文是web.config或app.config作为配置/运行时/ assemblyBinding节点的子节点。

回答您支持Oracle 10g和11g的特定方案?有两个选项,前者是由用户@BQ建议的:

  1. 仅部署一个版本的ODP.NET。您应该可以从任一版本的ODP.NET(10g或11g)与两个版本的数据库服务器(10g和11g)进行通信。请参阅下面的@ BQ答案。
  2. 如果您确实需要能够链接到两个不同的程序集版本,则需要具有两个不同的版本重定向配置。换句话说,您需要两个app.config文件,其中一个包含到10g ODP.NET版本的版本重定向,另一个包含11g ODP.NET版本。
  3. 还有一些提示:

    1. 确保从GAC中删除任何Oracle提供的发布商政策。这些优先于web / app.config
    2. 中的那些
    3. 默认情况下,缓存绑定失败,因此如果ODP.NET程序集碰巧与版本重定向绑定失败,则需要重新启动IIS以清除缓存的失败。

答案 1 :(得分:2)

如果在Visual Studio中选择引用并转到“属性”窗口(默认为F4),则会看到标记为“特定版本”的选项。如果将此项设置为false,则项目将接受DLL的不同版本。

现在这并不一定意味着项目将找到 DLL的版本。如果它不在.exe附近(即在文件夹或子文件夹中)或GAC中,那么你必须自己做一些工作来加载它。

答案 2 :(得分:1)

如果您需要让您的应用程序支持可能在您部署的计算机上的多个Oracle.DataAccess版本,请参阅@MattRodatus关于使用绑定重定向的优秀答案。

但是,您应该能够使用任一版本的Oracle客户端安装访问10g或11g数据库。

请参阅Oracle: Does a 10g oracle client work with an 11g server?上的@ the.jxc答案,了解哪些客户支持哪些数据库的详细说明。