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

Iai*_*ain 16 asp.net

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

  1. 这种理解是否正确?

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

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

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

Iai*_*ain 26

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

<system.web>
    <compilation>
        <assemblies>
            <add assembly="*" />
        </assemblies>
    </compilation>
</system.web>
Run Code Online (Sandbox Code Playgroud)

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

通过修改应用程序的web.config(不是全局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>
Run Code Online (Sandbox Code Playgroud)

我们还在试验这个,所以不确定这是否能完全解决问题或有任何不寻常的副作用.

  • 这很棒,感谢帖子!我用它来排除早期绑定到非托管dll的.Net程序集,这导致可怕的无法找到程序集或其依赖项之一的异常.然后,为了能够在实际需要时找到unmanged dll,使用此处的LoadLibrary方法:http://stackoverflow.com/questions/377181/32-or-64-bit-dll-loading-from-net -managed码/ 652845#652845 (2认同)

Osc*_*ero 3

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

如果您想按需加载程序集,请尝试使用反射,这样您就可以控制加载程序集的时机和时间。

**编辑: **

如果您无法控制 B 和 C,但您说 B 需要 C 才能运行,并且 A 对 B 有硬引用。对我来说,听起来您需要 ABC 组件才能工作,您可以尝试从以下位置删除 B 依赖项: A 通过使其成为松散的情侣。

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

如果没有 C 组件,您的解决方案如何编译?

C存储在GAC中吗?