确定装配的装载上下文

时间:2014-05-01 13:08:59

标签: c# .net-assembly

鉴于已加载Assembly,有一种方法(在代码中)可以确定加载到的3个加载上下文中的哪一个(默认加载 LoadFrom,都不)?

Suzanne Cook's "Choosing a Binding Context"文章中,将程序集加载到 LoadFrom 时会出现一些缺点。特别是,我的库使用反序列化并在加载到 LoadFrom 上下文时遇到InvalidCastException

目前我的库失败很晚(它在执行有问题的反序列化代码时失败 - 请参阅my example)。在这些情况下,我想通过检测加载的上下文并在未加载到默认加载上下文中时抛出异常来使其失败。

2 个答案:

答案 0 :(得分:3)

您可以测试它的行为,而不是识别程序集的上下文。例如,对于序列化,序列化程序将调用Assembly.Load,该程序集必须匹配正在序列化的对象的程序集。可以通过检查CodeBase来测试匹配。

private static bool DoesAssemblyMatchLoad(Assembly assemblyToTest)
{
    try
    {
        var loadedAssembly = Assembly.Load(assemblyToTest.FullName);
        return assemblyToTest.CodeBase == loadedAssembly.CodeBase;
    }
    catch (FileNotFoundException)
    {
        return false;
    }
}

答案 1 :(得分:0)

  • 仅反射上下文: 属性ReflectionOnly = true
  • 无上下文(动态): 属性IsDynamic = true
  • 没有上下文(laod(byteArray): 属性位置= null
  • 默认上下文: 属性GlobalAssemblyCache = true或属性Location以属性CodeBase开头
  • 加载自上下文: 假设您不会从代码库中加载其他任何东西