c# - 使用 PC 上已有的 Oracle.DataAccess.DLL,不提供

标签 c# oracle dll

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

提前致谢。

最佳答案

SpecificVersion 是仅在构建期间应用的属性。它旨在帮助构建环境中是否存在多个版本的程序集;当 SpecificVersion 为真时,它将确保您构建并引用所需的版本。但是,一旦构建了目标程序集,其引用就会包含引用程序集的强名称和版本号。因此,如果 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. 默认情况下,绑定(bind)失败会被缓存,因此如果 ODP.NET 程序集碰巧无法与版本重定向绑定(bind),您将需要重新启动 IIS 以清除缓存的失败。

关于c# - 使用 PC 上已有的 Oracle.DataAccess.DLL,不提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4492462/

相关文章:

c# - 如何访问 ApiController 中的 Response

c# - 在另一个列表 c# 中添加对象和对象列表

c# - JToken 上的 LINQ where 查询

sql - 如何在Oracle中获取 "Open"XML数据

c++ - 向 DLL 公开应用程序 API 和数据

C#、 Entity Framework 核心和 PostgreSql : inserting a single row takes 20+ seconds

sql - Oracle SQL View : Multiple rows to one with help of foreign key

oracle - Oracle:SQL未正确结束

windows - 使用 Go 1.7 构建 dll

c# - 将 c 字符数组 [128] 编码到 c#