2010-12-20 53 views
3

我期待让我的程序更具动态性。我希望它能够使用相同的程序来支持Oracle 10g和Oracle 11g数据库。如果我使用一个版本的.DLL参考编译程序,那么另一个版本会失败。有没有办法使用已经安装在计算机上的Oracle.DataAccess.DLL,而不是在我的安装程序中提供DLL?在PC上使用Oracle.DataAccess.DLL,不提供它

在此先感谢。

回答

6

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

“请注意,特定版本属性只是构建时指令,它对引用程序集的运行时版本解析没有影响”(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> 

(参见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版本。

再提一些建议:

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

对于一个很好的答案+1,尤其是绑定重定向。但对于原始提问者,只要您可以提供适当的连接信息(TNSNAMES别名等),就应该能够使用10g或11g客户端来访问10g或11g数据库。 – 2010-12-20 19:17:02

+0

@BQ这是一个好点!我引用了你并在上面添加了你的答案。 – 2010-12-20 19:25:38

2

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

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

+0

何时将其添加到GAC?那是我应该做的事,还是应该在安装Oracle时发生? – 2010-12-20 18:32:23

+0

我不确定Oracle安装程序是否将其放入GAC中,但我想有些情况下它不会将它放入GAC中。我知道你可以做ODAC的“XCOPY”风格部署,在这种情况下,它不在GAC中。你可能更适合用应用程序部署最新版本;即使使用v11 DLL,使用Oracle 10服务器也不会有任何问题。 – CodingGorilla 2010-12-20 18:41:34

1

见@MattRodatus'关于使用,如果你需要让你的应用程序支持的Oracle.DataAccess多个版本,可能是要部署到机器上的绑定重定向出色答卷。

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

请参阅@ the.jxc的答案Oracle: Does a 10g oracle client work with an 11g server?,以获取有关哪些客户端支持哪些数据库的完整摘要。

相关问题