我找不到任何有关它的信息.有没有人知道IIS是加载Web应用程序的bin目录中的所有dll还是任何目录中的所有dll,或者只是项目引用的目录(在这种情况下它是如何确定哪个dll是"master")?
我刚刚遇到某种情况,有人在部署新版本之前没有从Web应用程序目录中删除所有文件,而某些dll已重命名.这个冗余的dll位于MVC 4 Web应用程序的bin目录中.
它不会自动加载任何DLL.
它加载的每个DLL都与请求直接相关.首先,编译Global.asax(可能会加载一些DLL bin).然后,在web.config中定义了任何HTTP模块和HTTP处理程序(与上一步有一些重叠).然后是最终的aspx/asmx/...其他一些可能会作为配置的一部分或类似的东西,但所有加载的DLL总是显式加载.
因此,没有"主"DLL.web.config,Global.asax和实际请求的文件是决定实际发生的事情的文件.如果您需要加载特定的DLL(并且您不是简单地引用它),您需要自己完成.
编辑:
由于这有点复杂,让我扩展一下.
这里要记住的主要事情是ASP.NET 总是 动态编译 - 至少在一定程度上.至少,你总是要编译Global.asax- 没办法解决它.现在,ASP.NET中的动态编译有一个重要的特性 - 它是进程外的(至少对于遗留编译器 - 我不确定Roslyn +).因此,无论编译器如何查找引用等,实际上并不反映加载到工作进程本身的内容 - 特别是应用程序域.
动态编译由BuildManager.NET端的类处理- http://referencesource.microsoft.com/#System.Web/Compilation/BuildManager.cs,fb803c621f3806a8.由于您询问了"主DLL",最相关的位将是处理Global.asax编译的代码,这是任何ASP.NET应用程序的起点之一.最初的编译由该EnsureTopLevelFilesCompiled方法处理.查看代码,您可以轻松查看第一步:
CompileResourcesDirectory();
CompileWebRefDirectory();
CompileCodeDirectories();
...
CompileGlobalAsax();
Run Code Online (Sandbox Code Playgroud)
对于网站和网站项目以及预编译的网站,大多数情况略有不同,但我们几乎可以忽略这一点.现在,代码并不是世界上最简单的代码,但基本上,它归结为生成一堆程序集 - 每个代码目录大约有一个程序集.同样,这是在进程外完成的 - 虽然编译器必须加载二进制文件bin,但它们不一定会加载到ASP.NET工作进程中.相反,实际只加载了必要的引用.
从中获取的主要内容是动态编译确实会做很多解决方案来帮助您(毕竟,您甚至不知道编译类型的动态程序集的名称,因此您无法指定它!) - 但这并不意味着所有的程序集bin都加载到ASP.NET应用程序域中.检查这个的最简单方法是添加一个未在任何地方引用的空程序集,bin然后打印出来AppDomain.Current.GetAssemblies- 您将看到在编译过程中确实触摸了文件时,它没有加载到 ASP.NET中应用领域.如果您尝试在ASP.NET中实现某些动态模块加载,则需要牢记这一点 - 您需要自己加载这些程序集.
您可以调整编译在web.config中的工作方式(尤其是全局编译) - 例如,默认情况下,所有程序集bin都是为编译目的而加载的,但您可以使用system.web/compilation/assemblies标记来挑选任何您想要的内容.
作为一项实验,我制作了一个新的ASP.NET Webforms项目,并将其部署到IIS.然后,我创建了第二个.net类库,并将.dll文件复制到Web应用程序的\bin文件夹(类库未在ASP.NET应用程序中的任何位置引用或使用).
我启动了SysInternals ProcMon,在IIS中回收了应用程序池和网站,并在浏览器中请求了该站点.
w3wp.exe确实在第一页请求时读取了类库.dll文件.
此MSDN页面还指出:
您可以将已编译的程序集存储在Bin文件夹中,Web应用程序中任何位置的其他代码(例如页面代码)都会自动引用它.一个典型的例子是你有一个自定义类的编译代码.您可以将已编译的程序集复制到Web应用程序的Bin文件夹中,然后该类可用于所有页面.
Bin文件夹中的程序集不需要安装在全局程序集缓存(GAC)中.Bin文件夹中存在.dll文件足以让ASP.NET识别它.
这似乎暗示ASP.NET将反映它找到的程序集\bin并自动加载它们.
有趣的是,即使您将一个非.NET文件(我twain.dll从C:\ Windows 复制)放入您的ASP.NET bin文件夹,也会读取这些文件.运行时似乎只是询问文件系统\bin\*并遍历文件以检查要加载的.NET程序集.
我也注意到,如果你把它添加到你的web.config文件:
<system.web>
<compilation targetFramework="4.5">
<assemblies>
<clear />
</assemblies>
</compilation>
Run Code Online (Sandbox Code Playgroud)
然后该页面将不再运行,并显示错误
无法加载"WebApplication1.Global"类型.
因此,似乎运行时不再从程序集中加载这些类.但是,运行时仍会从驱动器中读取未引用的控制台应用程序.dll和non.net程序集twain.dll.
所以,答案归结为你所说的"加载所有dll"...如果你的意思是在运行时可用,那么如果你指定自己的答案就是"不",system.web | compilation | assemblies但默认是加载所有.但如果你的意思是什么文件是物理阅读,那么"是".
| 归档时间: |
|
| 查看次数: |
6861 次 |
| 最近记录: |