注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
如果程序集加载到上下文中LoadFrom,则会loadFromContext激活托管调试助手(MDA)。 由于调用 Assembly.LoadFrom 或类似的方法,可能会出现这种情况。
症状
使用某些加载程序方法可能会导致程序集在上下文中 LoadFrom 加载。 使用此上下文可能会导致序列化、强制转换和依赖项解析出现意外行为。 通常,建议将程序集加载到 Load 上下文中以避免这些问题。 很难确定程序集在没有此 MDA 的情况下加载到哪个上下文。
原因
通常,如果程序集是从上下文外部的路径(例如全局程序集缓存或属性)加载到上下文中Load,则会将其加载LoadFrom到AppDomainSetup.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");
}
}
}