出于性能原因,我正在尝试将我的程序集放在GAC中。它有一些绑定到AssemblyResolve事件的代码。然而,由于GAC‘’ing我的程序集,当解析的源来自我自己的GAC‘’d程序集时,AssemblyResolve事件处理程序不再被命中。
换句话说,我的GAC程序集引用了XYZ.dll。我的GAC程序集将XYZ.dll存储为在启动时加载的嵌入式资源,而不必单独重新分发它。程序集解析处理程序返回动态加载的XYZ.dll实例。但是,现在我的程序集已经GAC了,XYZ.dll的AssemblyResolve事件根本不会触发。
我猜这与加载上下文是different...but有关,我不确定如何处理它。既然我的程序集是GAC的,我怎么才能让解析工作呢?
发布于 2012-02-26 05:45:33
当然,这不起作用。GAC是一个DLL地狱对策,它确保任何依赖于特定版本的DLL的应用程序都能获得他们所要求的特定版本的DLL。始终如一,无论什么进程需要它。允许在进程的探测路径中解析GAC-ed DLL的依赖项将以最糟糕的方式带回DLL地狱。它完全破坏了GAC提供的保证,DLL现在不能被信任以一致的方式工作。
这不仅仅是微妙的,一个基本上可怕的场景是,在GAC-ed的程序集中定义的派生类的基类是在依赖程序集中定义的。您希望的工作将允许一个完全不同的基类实现。如果基类没有太大的不同,抖动不会下降的可能性是合理的。运行时的实际结果相当糟糕,错误的代码执行时几乎没有方法来诊断原因,特别是对于没有调试器的用户。DLL地狱是用户的噩梦,最不能诊断和修复问题的人是受害者。
CLR断然拒绝让你以这种方式射杀用户。是的,加载上下文是关键,Fusion是底层api。
https://stackoverflow.com/questions/9448312
复制相似问题