我有一个Visual Studio 2010项目,我引用了一个指向本地版本的程序集Oracle.DataAccess.dll。
我已经明确地将“特定版本”选项设置为false但是在构建应用程序时我检查了应用程序程序集并且它具有对
的特定引用Oracle.DataAccess,Version = 2.112.3.0,Culture = neutral,PublicKeyToken = 89b483f429c47342
如何引用特定版本的程序集?
我想依赖bin文件夹中可用的版本。
目前显然取决于应用程序的构建位置。如果我在安装了不同版本的Oracle客户端的计算机上构建项目,则主应用程序中将包含不同的Oracle.DataAccess版本控制引用。
它不应该依赖于应用程序的构建位置。它不应该引用任何特定版本。
答案 0 :(得分:6)
特定版本是一个编译时检查,您实际构建的版本是您在项目/文件引用中实际拥有的版本。
您编译的哪个版本作为引用的程序集进入已编译的程序集元数据。这包括程序集版本号,因为它是程序集与CLR的标识的一部分。如果输出程序集中没有包含版本,则无法引用另一个程序集。
对于您的场景,我可能会将Specific Version设置为true,因此如果我在安装了不同版本的计算机上构建它,则编译将失败。如果我想针对新版本进行编译,那么我会更新项目文件。
如果您希望针对引用程序集的可能较新版本运行,则可通过策略正确控制。 Oracle提供的发布者策略文件,或者您通过app config程序集绑定重定向确定应用程序与较新版本完全兼容的文件。此documentation提供了通过配置文件重定向的示例。
答案 1 :(得分:0)
好吧,因为你在项目中引用了.dll,你无法避免指定版本。如果要在不依赖其版本的情况下调用.dll文件,则必须在代码中执行此操作。见this
答案 2 :(得分:0)
如果将SpecificVersion设置为false,则可以轻松替换引用的程序集,它可以正常工作。您提到的版本仅表示项目的构建版本。
您可以轻松检查此行为。创建一个类库项目,其中包含一个返回一些字符串消息的公共方法。构建它并将生成的程序集放在您将引用它的某个文件夹中。然后创建一个控制台项目,它将使用SpecificVersion = false和CopyLocal = true引用您的程序集,并将消息输出到控制台。构建并运行。之后,更改第一个项目中返回的字符串,更改版本,构建并替换控制台项目可执行文件附近的程序集。再次运行,您将看到该消息已更改。
答案 3 :(得分:0)
对于Oracle.DataAccess,情况有点特殊。查看我安装的Oracle.DataAccess的截图
您可以安装verison 1.x,2.0或4.0,请参阅此处的可用下载: Oracle Data Access Components (ODAC) for Windows
它还取决于您安装的Oracle客户端版本。 ODP.NET版本1.x仅在Oracle 11.1之前可用。 版本1.x和2.0彼此不是100%兼容(但可以在同一代码中管理它们)。在VS中,您可以指定版本,例如2.0。在这种情况下,您必须在您的计算机上安装版本2.x.x.x,在我的情况下,它将加载2.102.2.20,请参阅前面的答案中的策略。 如果指定版本1.x,则必须在计算机上安装版本1.x.x.x. 对于4.0版,我还没有测试。
在我开发的应用程序中,我提供了两个不同的Setup.exe。客户必须根据其Oracle客户端安装选择正确的设置。
您可以在此处找到更多信息:ODP.NET FAQ
我安装的Oracle.DataAccess