asp.net-mvc - 加载程序集时会发生什么?

标签 asp.net-mvc assemblies

在我的 ASP.NET MVC 应用程序中,我有以下设置:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="bin;extras"/>

我引用了位于 extras 中的程序集 View 中的文件夹,它们运行良好(使用 <%@ Import Namespace="myNameSpace" %> )。

我的问题
  • 调用该行时会发生什么?
  • 程序集在哪里加载?
  • 为什么我无法覆盖位于 extras 中的程序集?包含 myNameSpace 的文件夹有更新的版本? (我收到一条错误消息,说程序集在另一个程序中“打开”)
  • 有没有办法在不重新启动应用程序的情况下用较新版本覆盖程序集?
  • 最佳答案

    1)导入在运行时实际上并没有做任何事情。这是一种编译时的便利,它只允许您使用它们的非限定名称来引用类型,例如 Environment 而不是 System.Environment。

    2) 使用正常的程序集探测规则加载程序集。 CLR 在这些私有(private)探测路径之前检查各个位置,因此请务必牢记这一点。如果您引用强名称程序集并希望在私有(private)探测路径中找到该程序集,则首选 GAC 中具有相同强名称(名称、版本、公钥等)的程序集。这有时会导致意外行为,通常是由于在您的 AssemblyInfo.cs 中硬编码程序集版本并忘记更新它造成的。

    3) 加载后,如果不卸载 AppDomain,则无法卸载程序集。但是 ASP.NET 使用“影子复制”,这意味着程序集在加载之前被复制到临时路径。这应该使原始程序集处于解锁状态并且能够被覆盖。在我的脑海中,我不确定您为什么会收到有关锁定程序集的错误。在普通的 Windows 应用程序中,这是完全正常的和预期的。但是 ASP.NET 的设计目的是让您可以在应用程序运行时覆盖内容、代码、程序集等,这导致了 #4。

    4)在实践中,没有。由于无法卸载程序集,因此无法在不重新启动 Web 应用程序的情况下升级程序集。从技术上讲,您可以加载程序集的多个版本,但这不会给您想要的结果。任何编译时引用仍将引用旧程序集,如果您尝试使用新程序集,您将获得各种无效的强制转换异常。但正如我在 #3 中所说,使用 ASP.NET 升级程序集应该像替换文件一样简单,并且应该自动发生。您不必手动重新启动 IIS 或工作进程。

    以下链接可能会引起您的兴趣。

    How the Runtime Locates Assemblies
    Best Practices for Loading Assemblies
    Shadow Copying Assemblies
    Unloading Assemblies - Suzanne Cook

    更新
    在阅读了有关卷影复制的更多内容后,我认为您可能会在 extras 文件夹中看到锁定程序集问题的原因是 ASP.NET 可能只为 shadow copying 指定了“bin”文件夹。 .

    关于asp.net-mvc - 加载程序集时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2391489/

    相关文章:

    .net - 在 CLR4 中生成发布者证据

    ASP.NET MVC 是发布模型 ID 的更好方法吗?

    asp.net - 设计一个可单元测试的类

    c# - 我可以声明一个 Type<T> 的变量而不在编译时指定 T 吗?

    c# - 在 Direct X 11 游戏中挂接 Direct X Endscene

    .net - LoadFrom 和上下文

    .net - 是否有可能在非 CLR 程序中使用 .NET 程序集?

    c# - 发布后 ASP.NET MVC 小写 URL 不起作用

    javascript - Bootstrap 星级评定 onclick 不开火

    asp.net-mvc - MVC 3中的区域全局过滤器