У меня проблемы с кодом:
private class ClientPluginLoader : MarshalByRefObject
{
public bool IsPluginAssembly(string filename)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomainReflectionOnlyAssemblyResolve);
Assembly asm = Assembly.ReflectionOnlyLoadFrom(filename);
Type[] types = asm.GetTypes();
foreach (Type type in types)
{
if (type.IsSubclassOf(typeof(ClientPlugin)))
{
return true;
}
}
return false;
}
}
Код вызывается через прокси, который я создал через CreateInstanceFromAndUnwrap () моего домена приложения. Это означает, что IsPluginAssembly () выполняется в контексте моего пользовательского домена приложения.
Проблема в том, что вызов IsSubclassOf () всегда возвращает false, даже если он ИМХО возвращает true. «Тип», о котором идет речь, действительно наследуется от ClientPlugin - в этом нет никаких сомнений.
ClientPlugin определен в другой частной сборке, которую я решаю вручную, как видно из фрагмента кода выше.
Я установил точку останова в строке if (type.IsSubclassOf(...))
и подтвердил, что это выражение ложно:
type.BaseType == typeof(ClientPlugin)
С другой стороны, это выражение верно:
type.BaseType.FullName == typeof(ClientPlugin).FullName
Как это возможно? Что происходит?
ОБНОВЛЕНИЕ: Кент Бугаарт указал мне правильное направление. Я немного поискал в Интернете и наткнулся на этот пост в блоге. Похоже, мне придется разрешить конфликты Load / LoadFrom / ReflectionOnlyLoadFrom, чтобы эта работа работала.