C# 3种绑定上下文的用途是什么?

C# 3种绑定上下文的用途是什么?,c#,.net,C#,.net,我知道有3种不同的绑定上下文或加载上下文: Load LoadFrom LoadNeither 什么是加载上下文 它们是干什么用的 为什么要使装配加载如此复杂 在“loadnote”中,“note”是什么 先谢谢你 ---------------以下是我最近发现的一些有用的引文-------------------- 理解上下文 没有一篇关于活页夹的文章不涉及加载器上下文及其存在的原因就不完整。加载器上下文通常是混乱的根源。将加载程序上下文视为应用程序域中保存程序集的逻辑存储桶。根据程序集的加

我知道有3种不同的绑定上下文或加载上下文:

Load
LoadFrom
LoadNeither
  • 什么是加载上下文
  • 它们是干什么用的
  • 为什么要使装配加载如此复杂
  • 在“loadnote”中,“note”是什么
  • 先谢谢你

    ---------------以下是我最近发现的一些有用的引文--------------------

    理解上下文

    没有一篇关于活页夹的文章不涉及加载器上下文及其存在的原因就不完整。加载器上下文通常是混乱的根源。将加载程序上下文视为应用程序域中保存程序集的逻辑存储桶。根据程序集的加载方式,它们分为三种加载程序上下文之一

    加载上下文简单地说,GAC中、ApplicationBase中或ApplicationBase下PrivateBinPath中使用Assembly.Load加载的所有程序集都将在加载上下文中加载。使用AssemblyResolve事件解析的程序集也属于此类别

    LoadFrom context如果您试图通过提供ApplicationBase之外的特定路径来加载程序集,并且在加载上下文中找不到该程序集,则会在LoadFrom上下文中加载该程序集

    无上下文如果试图使用assembly.LoadFile()、assembly.load(字节[])或Reflection.Emit加载程序集,则这些程序集将加载到无上下文中

    对于加载到LoadFrom上下文中的程序集,绑定器首先检查确切的程序集(相同的标识和位置)是否已存在于加载上下文中。如果是,它将丢弃LoadFrom上下文中的程序集信息,并使用Load上下文中的程序集信息。在确定它是否是同一个程序集时,位置信息很重要,我们将很快介绍这一点。在.NET Framework 1.1中,这被称为LoadFrom的第二个绑定,因为绑定器用于执行两个步骤,首先将程序集放置在LoadFrom上下文中,然后在加载上下文中找到匹配的程序集标识和位置时将其升级到加载上下文

    确保程序集尽可能多地加载到加载上下文中。为此,程序集应该可以从GAC、ApplicationBase或AppDomain的PrivateBinPath中找到。加载到此上下文中的程序集将自动获得NGen的好处,并且会自动拾取此上下文中存在的程序集依赖项

    将程序集加载到LoadFrom上下文有其自身的优点,它允许通过指定路径加载ApplicationBase之外的多个程序集

    现在,让我们讨论程序集的位置,同时确定通过LoadFrom()加载的程序集是否与通过Load()加载的程序集相同。即使两个程序集中的类型相同,如果两个程序集是从不同的路径加载的,就加载程序上下文而言,它们也不被认为是相同的。这会导致在相同的应用程序域中重复加载相同的程序集,但加载到不同的上下文(Load和LoadFrom),并且加载上下文中的程序集中的类型在LoadFrom上下文中不允许是相同的类型(即使就程序集标识而言,它们是相同的程序集)。这是LoadFrom的缺点之一。此外,LoadFrom上下文中的程序集不会自动获得NGen的好处。

    对于这两个上下文,除非应用程序订阅AssemblyResolve事件,否则无法将此上下文中的程序集绑定到。一般应避免这种情况

    那么,为什么CLR首先有加载程序上下文呢?加载程序上下文有助于确保加载程序集时的加载顺序独立性。此外,当程序集及其依赖项加载到不同的上下文中时,它们还提供了对程序集及其依赖项的隔离度量。


    --从

    可能只有少数人能回答问题的“为什么”部分。加载上下文主要与依赖项的绑定方式有关。我的理解是:

    • Load
      ,使用“传统”位置和绑定方法将程序集加载到
      AppDomain
      。加载的程序集可以用作
      Load
      上下文中加载的后续程序集的依赖项
    • LoadFrom
      ,将程序集加载到
      AppDomain
      中,查找类似
      Load
      的依赖项,但有一个区别:这些程序集不会用于解析
      Load
      上下文程序集的依赖项
    • loadnote
      只加载一个程序集。如果它有未解析的依赖项,您需要通过
      AssemblyResolve
      事件自己解析它们
    这是一个很棒的博客:

    谢谢您的回复。我还有一个问题:当我通过“添加引用”上下文菜单在VisualStudio中添加程序集引用时,引用的程序集在什么上下文中?再次感谢,没有直接联系。但是添加引用通常会将“复制本地”属性设置为True,以便将程序集的副本放在项目生成文件夹中。这使CLR很容易找到它,因为它是默认的探测路径。我应该给出一个更完整的答案:它是在引用程序集加载的任何上下文中加载的。依赖项不影响加载依赖项程序集的上下文;很抱歉,我不能标记你的答案,因为我看不到你答案左侧的标记信号。我不知道为什么我看不到答案左侧的标记信号。好任务