如何阻止ASP.NET在第一次加载时从bin加载所有程序集

时间:2009-02-03 17:21:37

标签: asp.net

原生DotNet应用程序将在首次使用时加载所有引用的程序集(及其引用)。但是,ASP.NET将在首次访问时加载所有引用的程序集(及其引用)。

  1. 这种理解是否正确?

  2. 有没有办法强制ASP.NET按需加载程序集(如本地应用程序)?

  3. 我想解决的具体方案是:

    • bin文件夹包含2个文件: A.dll B.dll
    • A.dll 引用 B.dll
    • B.dll 引用 C.dll ,它位于系统的其他位置。在这种情况下, C.dll 缺失。
    • A.dll 由主应用程序加载(使用反射)。
    • 遇到的错误(无法加载文件或程序集...... )与 B.dll 缺少的依赖关系有关。
    • 如果缺少 C.dll ,我们希望应用程序正常运行,因为这是主应用程序的可选组件。
    • 我们无法控制 B.dll C.dll 的内容。

2 个答案:

答案 0 :(得分:25)

要回答第3点,可以在 C:\ winnt \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG文件中找到导致第一次访问时加载bin文件夹中所有程序集的设置。 \ web.config (取决于您的环境)。从该文件中删除摘录:

<system.web>
    <compilation>
        <assemblies>
            <add assembly="*" />
        </assemblies>
    </compilation>
</system.web>

与通配符匹配的所有程序集都作为初始编译的一部分加载。

通过修改应用程序的web.config( NOT 全局DotNet)来包含Web服务程序集并排除通配符匹配,如果可选的依赖项是,则应用程序可以正常运行丢失:

<system.web>
    <compilation>
        <assemblies>
            <remove assembly="*" />
            <add assembly="Main.Application.WebService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YOURKEYHERE" />
        </assemblies>
    </compilation>
</system.web>

我们仍在尝试这一点,所以不确定这是否能完全解决问题或有任何不寻常的副作用。

答案 1 :(得分:3)

asp.net加载所需的所有程序集,因为工作进程创建了一个app域,其中包含每个实例的所有必需程序集。

如果您想按需加载程序集,请尝试以这种方式使用反射,您可以控制何时以及何时加载程序集。

**编辑:**

如果你没有对B和C的控制但是你说B需要C来运行,并且A有一个对B的硬引用对我来说听起来你需要ABC组件才能工作,你可以尝试删除来自A的B依赖使它成为松散的夫妻。

你可以使用反射来从A加载B但是B仍然需要C它仍会导致问题。

您的解决方案如何使用C组件进行编译?

是否存储在GAC中?