loadFromContext MDA

更新:2007 年 11 月

如果向 LoadFrom 上下文中加载了一个程序集,则将激活 loadFromContext 托管调试助手 (MDA)。调用 Assembly.LoadFrom 或其他的类似方法时会发生这种情况。

症状

使用某些加载程序方法可能会导致向 LoadFrom 上下文中加载程序集。使用此上下文可导致序列化、强制转换和依赖项解析出现意外行为。通常,建议将程序集加载到 Load 上下文中以避免出现这些问题。如果不使用此 MDA,则很难确定程序集加载到了哪个上下文中。

原因

通常,如果从 Load 上下文之外的路径(如全局程序集缓存或 AppDomainSetup.ApplicationBase 属性)加载程序集,则程序集会被加载到 LoadFrom 上下文中。

解决办法

配置应用程序使其不再需要 LoadFrom 调用。您可以使用以下技术来实现此目的:

  • 在全局程序集缓存中安装程序集。

  • 将程序集放置在 AppDomainApplicationBase 目录中。对于默认域,ApplicationBase 目录是启动进程的可执行文件所在的目录。如果不能方便地移动程序集,则可能还需要创建一个新的 AppDomain

  • 如果依赖程序集位于相对于可执行文件的子目录中,则应向您的应用程序配置 (.config) 文件或辅助应用程序域添加一个探测路径。

在每种情况下,都可以更改代码以使用 Assembly.Load 方法。

对运行库的影响

此 MDA 对 CLR 无任何影响。它会报告因加载请求而使用的上下文。

输出

此 MDA 会报告已将程序集加载到 LoadFrom 上下文中。它指定该程序集的简单名称和路径。它还建议进行迁移以避免使用 LoadFrom 上下文。

配置

<mdaConfig>
  <assistants>
    <loadFromContext />
  </assistants>
</mdaConfig>

示例

下面的代码示例演示一种可激活此 MDA 的情况:

using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // The following call caused the LoadFrom context to be used
            // because the assembly is loaded using LoadFrom and the path is 
            // located outside of the Load context probing path. 
            Assembly.LoadFrom(@"C:\Text\Test.dll");
        }
    }
}

请参见

概念

使用托管调试助手诊断错误