次のコードで問題が発生しています。
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()の呼び出しは、IMHOがtrueを返す必要がある場合でも、常にfalseを返すことです。問題の「タイプ」は実際にはClientPluginから継承されます-それについては疑いの余地はありません。
ClientPluginは、上記のコードフラグメントで明らかなように、手動で解決している別のプライベートアセンブリで定義されています。
行にブレークポイントを設定し、if (type.IsSubclassOf(...))この式がfalseであることを確認しました。
type.BaseType == typeof(ClientPlugin)
一方、この式は真です。
type.BaseType.FullName == typeof(ClientPlugin).FullName
これはどのように可能ですか?どうしたの?
更新:ケント・ブオゴールは私を正しい方向に向けました。私はもう少しウェブを検索して、このブログ投稿に出くわしました。これを機能させるには、Load / LoadFrom/ReflectionOnlyLoadFromの競合を解決する必要があるようです。