C# 已在PC上使用Oracle.DataAccess.DLL,但未提供

C# 已在PC上使用Oracle.DataAccess.DLL,但未提供,c#,oracle,dll,C#,Oracle,Dll,我希望使我的程序更有活力。我希望它能够用相同的程序支持Oracle 10g和Oracle 11g数据库。如果我使用一个版本的.DLL引用构建程序,那么另一个版本将失败。是否有办法使用已安装在计算机上的Oracle.DataAccess.DLL,而不是在我的安装程序中提供DLL 提前感谢。如果您在Visual Studio中选择引用并转到“属性”窗口(默认情况下为F4),您将看到标记为“特定版本”的选项。如果将此设置为false,则项目将接受不同版本的DLL 现在,这并不一定意味着项目将找到DLL

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


提前感谢。

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


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

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

请注意,特定的Version属性只是一个生成时指令,它对引用程序集的运行时版本解析没有影响(http://www.code-magazine.com/article.aspx?quickid=0507041&page=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>

)

该dependentAssembly节点可以应用于不同的上下文。一种可能的上下文是在web.config或app.config中作为configuration/runtime/assemblyBinding节点的子节点

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

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

  • 确保从GAC中删除任何Oracle提供的发布者策略。这些文件优先于web/app.config中的文件
  • 默认情况下,绑定失败会被缓存,因此如果ODP.NET程序集在版本重定向时绑定失败,则需要重新启动IIS以清除缓存的失败

  • 如果您需要让应用程序支持多个版本的
    Oracle.DataAccess
    ,请参阅@MattRodatus关于使用绑定重定向的出色回答,该版本可能位于您要部署到的计算机上

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


    请参阅@the.jxc的答案,了解哪些客户机支持哪些数据库的简要说明。

    何时将其添加到GAC?这是我应该做的事情,还是应该在Oracle安装中发生的事情?我不确定Oracle安装程序是否将其放入GAC,但我想在某些情况下它不会将其放入GAC。我知道您可以对ODAC进行“XCOPY”式的部署,在这种情况下,它不会出现在GAC中。您最好只在应用程序中部署最新版本;即使使用V11DLL,使用Oracle10服务器也不会有任何问题。+1是一个很好的答案,尤其是绑定重定向。不过,对于最初的提问者,您应该能够使用10g或11g客户端访问10g或11g数据库,只要您能够提供适当的连接信息(TNSNAMES别名等)。@BQ这是一个很好的观点!我引用了你的话,并在上面添加了你的答案。