gpt4 book ai didi

asp.net - 为什么 ASP.NET 以不同的方式解析程序集引用?

转载 作者:行者123 更新时间:2023-12-04 16:12:49 26 4
gpt4 key购买 nike

我真的很努力地寻找类似的问题来获得一些线索,但似乎没有人描述我们遇到的情况,所以就这样吧。

背景

我们有一个具有以下总体设计的产品:

【本地安装文件夹】

  • 包含一组 .NET 程序集,实现了我们的大部分产品功能。
  • 示例:Implementation1.dll、Implementation2.dll

  • [海关总署]
  • 客户端API.dll。我们的客户端程序集,可从最终用户 Visual Studio 项目中引用。对本地安装文件夹中的实现 dll 有很强的引用。

  • 在 ClientAPI.dll 中,我们有一个需要最终用户项目调用的入口点。让我们称之为 Initialize() .

    我们在 Initialize 做的第一件事是在当前域上安装一个所谓的程序集解析处理程序,使用 AssemblyResolve事件。这个处理程序将知道如何定位实现 dll 并将它们加载到客户端进程中,使用 Assembly.Load() .

    考虑一个控制台应用程序。它看起来像:
    class Class1
    {
    void Main(string[] args)
    {
    ClientAPI.Initialize();

    // Use other API's in the assembly, possibly internally referencing the
    // implementation classes, that now will be resolved by our assembly
    // resolve handler.
    }
    }

    现在,在控制台/Windows 窗体/WPF 世界中一切都很好。我们的程序集解析处理程序已正确安装和调用,一旦 ClientAPI.dll 需要它们的功能,它就可以成功解析对实现 DLL 的引用。

    问题陈述

    话虽如此,我们不打算仅支持控制台或 WPF 应用程序,因此我们依赖于 ASP.NET 中的相同设计。因此,在 VS 2010 中创建一个新的 ASP.NET Web 应用程序项目,我们认为一切都将如此简单:
    class Globals : HttpApplication
    {
    void Application_Start(object sender, EventArgs e)
    {
    ClientAPI.Initialize();

    // ...
    }
    }

    在 ASP.NET 运行时世界中停留了 20-30 个小时,在开发服务器和 IIS 中尝试了上述内容,我们了解到那里的事情并不像我们预期的那样。

    原来,在ASP.NET中,只要 ClientAPI类在任何地方被引用,它对任何其他程序集的所有引用都会立即解析。不仅如此:结果被缓存(按照设计,自从我们发现 .NET 2.0 以来),这意味着我们根本没有机会尝试帮助 CLR。

    没有进一步阐述我们尝试和学习的不同事物,基本上可以归结为我们的这个问题:

    为什么 ASP.NET 像这样解析引用?它与其他类型的应用程序不兼容,更重要的是,它不符合 .NET/CLR 运行时的文档,指定在第一次需要时(即当首次在代码中使用)。

    任何形式的见解/想法将不胜感激!

    最佳答案

    Windows 窗体/WPF 应用程序在单个客户端计算机上运行(因此在单个本地上下文中运行),而 ASP.Net 在 IIS 内、应用程序池内、服务器或一组服务器上(在 Web 场情况下)运行。加载到应用程序池中的任何内容都可用于整个应用程序(因此在连接到应用程序的所有客户端之间共享)。

    HttpApplication.Application_Start 在应用程序启动时执行一次。它不像使用 Winforms 应用程序那样按客户端执行 - 如果您需要为每个连接的客户端初始化某些内容,请使用 Session_Start 或 Session_OnStart,但是您可能会遇到服务器的内存问题,具体取决于客户端的数量将连接到您的 Web 应用程序。这还取决于您的类是否是单例,以及 Initialize() 方法是否是静态的。如果您有这两种情况中的任何一种,您将很快遇到跨线程问题。

    此外,值得注意的是,空闲的 IIS 应用程序池会在一段时间后自行重置。例如,如果没有人在一夜之间使用 Web 应用程序,IIS 将刷新应用程序的应用程序池并释放内存。可以在 IIS 管理中更改这些设置,但这样做时应该小心 - 更改这些设置以规避设计不当的对象(或不是为 Web 应用程序设计的对象)可能会产生更多问题。

    仅供引用 - 我有点挑剔,但为了避免怀疑,对象没有被缓存 - 是的,它被加载到内存中,但是如何管理内存取决于你如何设计对象(缓存在 Web 世界中则完全不同,并且可以在应用程序的许多不同层中实现)。

    不要试图让 Web 应用程序表现得像 Windows 应用程序;你只会给自己制造更多的问题!

    关于asp.net - 为什么 ASP.NET 以不同的方式解析程序集引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025633/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com