我有一个简单的疑问:我有一个我想参考的外部装配。我有一个Asp.Net应用程序。我想在我的Asp.Net应用程序中使用该程序集。
我添加了一个引用,VS的作用就是将我的dll放在我网站的Bin子目录中。
我认为VS会修改我的web.config文件添加外部引用... 那么只有在GAC中引用程序集时才会发生这种情况吗? (鉴于公共令牌和版本是必需的,这是有道理的。)
三江源
答案 0 :(得分:6)
当CLR加载程序集以供执行时,它会检查程序集的清单以确定它运行所需的依赖项。它通过一系列步骤来实现这一目标:
检查重定向 - 如果程序集具有强名称,则CLR将首先检查相应的配置(app.config
,web.config
等)以看看是否有指定的绑定重定向。绑定重定向允许CLR说,我应该加载v1.0.0.0,而不是加载v2.0.0.0 。如果没有找到强名称程序集的绑定重定向,它将检查GAC中的策略文件,如果未找到策略文件,则会检查machine.config
。如果未指定绑定重定向,则CLR将使用调用程序集清单中指定的程序集名称来加载程序集。
检查程序集是否已加载 - CLR确定程序集先前是否已加载,如果已加载,则使用相同的已加载程序集,否则继续。 ..
从GAC加载程序集 - 如果先前无法加载程序集且名称很强,则CLR将尝试从全局程序集缓存加载程序集。
CodeBase - 如果CLR仍无法找到程序集,它将使用codeBase
路径尝试找到程序集。
探测 - 如果CLR仍无法找到程序集,它将检查程序集的探测路径。默认探测路径是当前正在加载程序集的AppDomain
的应用程序基本路径。
(这些都改编自一篇名为Understanding .Net Assemblies and References 的伟大文章。)
对于Web应用程序,CLR仍然执行上述所有操作,但AppDomain
应用程序基本路径是IIS应用程序中的/bin
文件夹。