72

我有一个 .NET 程序集(由于我无法控制的原因)必须在 GAC 中。但是,相同的程序集被另一个程序使用,该程序具有相同程序集的旧版本的自己的副本。它必须使用自己的副本,而不是 GAC 中的任何副本。在这种情况下,正确的版本控制可能比它的价值更麻烦,原因我不会讨论。我的问题是:无论如何要告诉 .NET:只需使用此 DLL,就在此目录中 - 忽略您在 GAC 或其他任何地方找到的任何内容

4

6 回答 6

48

确保 GAC 程序集和本地程序集具有不同的版本号(至少通过在 AssemblyInfo 中通配您的 AssemblyVersion 来让您的内部版本号自动递增并不是一个坏主意:[assembly: AssemblyVersion("1.0.0.*" )])。然后,使用您的应用程序的配置重定向您的程序集绑定:

在您的情况下,您不需要 assemblyBinding 配置的“appliesTo”属性。你只需要这样的东西:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
于 2008-11-06T05:42:56.100 回答
31

如果他们有相同的版本号,答案是你不能。如果您尝试加载与 GAC 程序集具有相同完整程序集名称(名称、版本、密钥)的程序集,CLR 将每次选择 GAC 程序集。

于 2008-11-06T05:53:20.010 回答
11

您可以设置 DEVPATH 以强制加载程序集,请参阅链接文本

这并不能回答您的问题,因为它仅用于开发用途,即使如此也不真正推荐,因为它不反映生产用途。但是,我想无论如何我都会分享它,因为很高兴知道。

于 2009-06-24T11:32:49.437 回答
2

我有一个类似的问题。ildasm我通过使用和ilasm生成一个新的 dll更改了目标 dll 的 publicKeyToken 。然后我在项目引用中更新它以指向新的 dll。我采取的步骤在这里

这对我有用。

于 2014-08-08T04:11:16.787 回答
2

您是否尝试过 Assembly.LoadFromFile()?这是一项手动操作,但应在需要之前将程序集加载到内存中。.NET 然后将使用内存中的那个而不是寻找它。

另一种方法是,如果本地程序集未签名,您可以这样区分它。

于 2008-11-06T05:21:05.377 回答
1

绑定重定向不起作用的一个原因是 Oracle.ManagedDataAccess 提供程序对 dll 的搜索顺序与非托管提供程序不同。非托管提供程序从应用程序目录开始,然后查找注册表中的 dllpath,然后是 machine.config 中的 dll 路径,然后是 web.config 中的 dll 路径。根据 Oracle 文档,托管提供程序的搜索顺序如下:

托管驱动程序将使用以下搜索顺序引用这些程序集:

  1. 全局程序集缓存
  2. Web 应用程序的 bin 目录或 Windows 应用程序的 EXE 目录
  3. x86 或 x64 子目录取决于应用程序是在 32 位还是 64 位 .NET Framework 中运行。如果应用程序是使用 AnyCPU 构建的,那么只要程序集可用,ODP.NET 就会使用正确的 DLL 位数。如果您的应用程序是 AnyCPU,Oracle 建议使用这种查找依赖程序集的方法。

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/installODPmd.html#GUID-0E834EC7-21DF-4913-B712-2B0A07FD58FD

因此,解决此问题的方法是取消注册 GAC 程序集,或者在您的 bin 和 web.config 中放置与 GAC 中不同版本的 Oracle.ManagedDataAccess,如果您无法卸载它。

于 2018-10-11T19:33:38.910 回答