通过


loadFromContext MDA

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

如果程序集加载到上下文中LoadFrom,则会loadFromContext激活托管调试助手(MDA)。 由于调用 Assembly.LoadFrom 或类似的方法,可能会出现这种情况。

症状

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

原因

通常,如果程序集是从上下文外部的路径(例如全局程序集缓存或属性)加载到上下文中Load,则会将其加载LoadFromAppDomainSetup.ApplicationBase上下文中。

解决方案

配置不再需要 LoadFrom 调用的应用程序。 可以使用以下方法执行此操作:

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

  • ApplicationBase程序集放置在目录中的 .AppDomain 对于默认域,目录 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");
        }
    }
}

另见