.Net程序集解析混淆

5

阅读完MSDN文章运行时如何定位程序集这篇文章后,我仍然不确定弱命名程序集在运行时是如何解析的。

例如,如果我在项目中引用了某个dll文件,编译并部署后,如果我只替换了实际在编译时被引用的旧版本dll文件,它是否会选择新版本的已引用的dll文件?如果项目文件中的引用指定了所引用程序集的版本等信息,是否会有影响?

欢迎任何启示。

4个回答

2

如果程序集未在全局程序集缓存(GAC)中找到,则CLR将在“探测路径”中搜索它。默认情况下,此路径仅为包含EXE的目录。 CLR只会查找程序集名称匹配的程序集,并且将在找到第一个匹配项后停止搜索。

然后,CLR将检查[AssemblyVersion]编号。如果不匹配,则会引发异常,它不会继续寻找另一个具有相同名称的程序集。每当您遇到解决问题时,都需要使用Fuslogvw.exe实用程序。它会显示CLR查找和出现了什么问题。


弱引用是否考虑版本号?我的经验是,如果您在探测路径中,它只会按名称匹配(不确定GAC,但是那样就不会是弱引用)。 - Adam Houldsworth
1
无论它是否具有强名称都不重要。只有GAC能够通过版本号解析引用的程序集。探测路径搜索仅按名称执行,找到程序集后仍会检查版本号。 - Hans Passant

1

我发现学习这方面最好的地方是 Grimes Fusion Workshop,可以在这里找到。它非常全面,同时易于理解。


0

你的问题的答案是肯定的,只要在程序集的引用属性中将Specific Version设置为False


0
如果未提及版本,则会选择引用,如果提及版本,则会尝试查找并加载与所提及版本匹配的程序集签名。如果未找到,则会抛出异常。为解决此问题,您可以执行程序集绑定重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接