Определить контекст загрузки сборки
Учитывая загруженный Assembly
, есть способ (в коде) определить, какой из трех загружаемых контекстов был загружен (по умолчанию Загрузить, LoadFrom, или Ни)?
В статья о Suzanne Cook "Выбор привязывающего контекста" , есть некоторые недостатки, которые возникают, когда сборка загружается в LoadFrom. В частности, моя библиотека использует десериализацию и встречает InvalidCastException
при загрузке в контекст LoadFrom.
В настоящее время моя библиотека терпит неудачу очень поздно (она терпит неудачу, когда она выполняет проблемный код десериализации - см. мой пример). Я бы хотел, чтобы в этом случае он не срабатывал намного раньше, обнаружив контекст, в который он загружен, и выбрасывает исключение, если он не загружен в контекст Загрузить.
Ответы
Ответ 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
- загрузка из контекста:
что-нибудь еще, предполагая, что вы не загрузите из базы кода