如何强制.NET 使用 GAC 中的程序集的本地副本

我有一个。NET 程序集,(由于我无法控制的原因) 必须的在 GAC 中。但是,同一程序集由另一个程序使用,该程序有自己的同一程序集旧版本的副本。它必须使用自己的副本,而不是 GAC 中的任何东西。在这种情况下,正确的版本控制可能比它的价值更麻烦,原因我不会详述。我的问题是: 还有什么好说的。NET: 只要使用这个 DLL,就在这个目录-忽略你在 GAC 或其他任何地方找到的任何东西

38489 次浏览

Have you tried Assembly.LoadFromFile()? This is a manual thing to do, but should load your assembly into memory before it is needed. .NET will then use the one in memory instead of hunting for it.

另一种方法是,如果本地程序集是无符号的,您可以用这种方法区分它。

罗伯

确保 GAC Assembly 和本地 Assembly 有不同的版本号(至少通过在 AssemblyInfo: [ Assembly: AssemblyVersion (“1.0.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>

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

可以设置 devPATH 以强制加载程序集,请参见 链接文本

这并不能回答你的问题,因为它仅仅意味着开发使用,即使那样也不是真正推荐的,因为它不反映生产使用。不管怎样,我想我还是会分享的,因为这是好事。

我也有过类似的问题。通过使用 ildasmilasm生成一个新的 dll,我更改了目标 dll 的 publicKeyToken。然后,我在项目引用中更新了它,以指向新的 dll。我采取的步骤是 给你

这招对我很管用。

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

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

  1. 全局程序集缓存
  2. Web 应用程序的 bin 目录或 Windows 应用程序的 EXE 目录
  3. 根据应用程序是以32位还是64位运行,来确定 x86或 x64子目录。NET 架构。如果应用程序是使用 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 程序集或者简单地放入不同版本的 Oracle。如果你不能卸载的话,你的 bin 和 web.config 中的 ManagedDataAccess 比 GAC 中的要多。

我在 GAC 中更改程序集的名称,将“ _”作为第一个字符。