gpt4 book ai didi

.net - 用于 GAC 程序集的 AssemblyResolve

转载 作者:行者123 更新时间:2023-12-04 05:56:38 25 4
gpt4 key购买 nike

出于性能原因,我试图将我的程序集放在 GAC 中。它有一些绑定(bind)到 AssemblyResolve 事件的代码。但是,由于 GAC 处理我的程序集,当解析源来自我自己的 GAC 程序集时,不再命中 AssemblyResolve 事件处理程序。

换句话说,我的 GAC 程序集引用了 XYZ.dll。我的 GAC 程序集不必单独重新分发它,而是将 XYZ.dll 存储为在启动时加载的嵌入式资源。程序集解析处理程序返回动态加载的 XYZ.dll 实例。但是,既然我的程序集是 GAC 的,则 AssemblyResolve 事件根本不会为 XYZ.dll 触发。

我猜这与加载上下文不同有关......但我不确定如何处理它。既然我的程序集是 GAC 的,我如何才能解决工作?

最佳答案

当然,这行不通。 GAC 是一种 DLL Hell 对策,它确保任何依赖于特定 DLL 版本的应用程序都能获得他们要求的特定版本的 DLL。始终如一,无论什么过程要求它。允许在进程的探测路径中解决 GAC-ed DLL 的依赖关系将以最糟糕的方式带回 DLL Hell。它完全违背了 GAC 提供的保证,现在不能信任 DLL 以始终如一地工作。

这也不仅仅是微妙的,一个基本可怕的场景是,在 GAC-ed 的程序集中定义的派生类的基类在依赖程序集中定义。您希望工作的内容将允许完全不同的基类实现。如果基类没有太大不同,则抖动不会下降的合理可能性。运行时的实际结果非常悲惨,执行错误的代码几乎没有办法诊断原因,尤其是对于没有调试器的用户。 DLL Hell 是用户的噩梦,最没有能力诊断和解决问题的人就是受害者。

CLR 断然拒绝让您以这种方式射击用户的脚。是的,加载上下文是关键,Fusion 是底层 api。

关于.net - 用于 GAC 程序集的 AssemblyResolve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com