Подтвердить что ты не робот

Определить контекст загрузки сборки

Учитывая загруженный Assembly, есть способ (в коде) определить, какой из трех загружаемых контекстов был загружен (по умолчанию Загрузить, LoadFrom, или Ни)?

В статья о Suzanne Cook "Выбор привязывающего контекста" , есть некоторые недостатки, которые возникают, когда сборка загружается в LoadFrom. В частности, моя библиотека использует десериализацию и встречает InvalidCastException при загрузке в контекст LoadFrom.

В настоящее время моя библиотека терпит неудачу очень поздно (она терпит неудачу, когда она выполняет проблемный код десериализации - см. мой пример). Я бы хотел, чтобы в этом случае он не срабатывал намного раньше, обнаружив контекст, в который он загружен, и выбрасывает исключение, если он не загружен в контекст Загрузить.

4b9b3361

Ответ 1

Вместо того, чтобы идентифицировать контекст сборки, вы можете проверить ее поведение. Например, для сериализации сериализатор вызовет 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;
    }
}

Ответ 2

  • контекст только для отражения:свойство ReflectionOnly = true
  • без контекста (динамический): свойство IsDynamic = true
  • без контекста (laod (byteArray): свойство Location = null
  • контекст по умолчанию: либо свойство GlobalAssemblyCache = true, либо свойство Location начинается со свойства CodeBase
  • загрузка из контекста: что-нибудь еще, предполагая, что вы не загрузите из базы кода