loadFromContext MDA

注意

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

如果程序集加载到 LoadFrom 上下文,将激活 loadFromContext 托管调试助手 (MDA)。 这种情况可能由于调用 Assembly.LoadFrom 或其他类似方法而发生。

症状

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

原因

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

解决方法

配置应用程序使其不再需要 LoadFrom 调用。 可以使用以下技术进行此操作:

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

  • 将程序集放在 AppDomainApplicationBase 目录。 如果采用默认域,ApplicationBase 目录是包含启动该进程的可执行文件的目录。 如果不方便移动程序集,可能还需要创建新的 AppDomain

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

每种情况下,均可将代码更改为使用 Assembly.Load 方法。

对运行时的影响

MDA 对 CLR 没有任何影响。 它报告由于加载请求而使用的上下文。

输出

MDA 报告程序集已加载到 LoadFrom 上下文。 它指定程序集的简单名称和路径。 它还建议避免使用 LoadFrom 上下文来减轻风险。

Configuration

<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");
        }
    }
}

请参阅