强制从/ bin而不是GAC加载程序集?

Mic*_*tum 27 .net asp.net assemblies

我有两个程序集,通过条件编译(dev和real)创建.

这些组件的公共表面是100%相同的:两者都有很强的名字; 两者都签署相同.snk,因此具有相同PublicKeyToken; 两者都有相同的文化和相同的版本.我无法改变这一点:使它们看起来完全相同是重点.

但是,在我的机器上,真正的程序集在GAC中.我有一个引用开发组件的ASP.NET 3.5 WebForms应用程序.绝对必须这样做; 真正的程序集崩溃了应用程序.

有没有办法强制特定的ASP.NET应用程序使用dev one(在...中/bin),给定:

  • GAC中有一个.
  • 两者都有相同VersionPublicKeyToken.
  • 两者都使用相同的密钥进行强名称/签名.
  • 我无法更改它们,无法更改版本,也无法删除密钥.

我注意到有人已经在#991293中询问了这个问题,但接受的答案涉及删除签名,这不是一个选项.

我运气不好吗?

Jar*_*Par 13

没有办法做到这一点.加载程序集时,CLR将检查GAC中是否存在具有等效强名称的DLL.如果GAC中有匹配的程序集,则每次都会选择GAC程序集.遗憾的是,无法覆盖此行为.


And*_*ykh 13

绑定程序集时始终首先尝试GAC:运行时如何定位程序集

所以不,你不能这样做.但是,如果你解释为什么你有这么奇怪的要求可能会有不同的工作,你没有想到.

  • 我知道这是旧的,但是例如:共享主机可能在GAC中安装了一个程序集.程序集是开源的,我修复了一个对我的应用程序至关重要的错误,编译它,并把它放在我的bin文件夹中.我最终做的是自我签名代码并使用sn.exe获取新的公共令牌. (5认同)

Wol*_*lf5 6

可能,但是它是高级的,需要您了解CLR及其工作方式和C ++。

看看这本Google图书:自定义Microsoft®.NET Framework公共语言运行时

关键字:IHostAssemblyManager,IHostAssemblyStore


Sve*_*owa 6

我找到了另一种方法。它仅适用于开发人员,但它确实有效。根据https://msdn.microsoft.com/en-us/library/cskzh7h6(v=vs.100).aspx 您在 .config 文件中设置了此内容

<configuration>
  <runtime>
    <developmentMode developerInstallation="true"/>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

您还需要将环境变量 DEVPATH 设置为 dll 的路径。打开 cmd,设置变量,运行您的应用程序:

SET DEVPATH=YOURLOCALPATH
Run Code Online (Sandbox Code Playgroud)

由于 Oracle 发布了新版本,这帮助我加载本地 Oracle.ManagedDataAccess.dll,但它们都具有相同的 Version 和 PublicKeyToken。谢谢甲骨文!

您可以使用 Microsoft 的 Process Explorer 来查看差异。请参阅https://technet.microsoft.com/en-us/sysinternals/ 将其视为一个小的概念证明: 进程浏览器屏幕截图