Aşağıdaki kod ile bazı sorunlar yaşıyorum:Type.IsSubclassOf(), AppDomains genelinde çalışmıyor mu?
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;
}
}
kod benim özel uygulama etki alanının CreateInstanceFromAndUnwrap aracılığıyla oluşturduğunuz bir proxy üzerinden denir(). Bu, özel uygulama alanımın bağlamında IsPluginAssembly() yürütüldüğü anlamına gelir.
Sorun, IMHO'nun true olarak geri dönmesine rağmen IsSubclassOf() çağrısının her zaman false döndürmesidir. Söz konusu "tip", ClientPlugin'den gerçekten miras alıyor - bundan şüpheniz yok.
İstemciPlugin, yukarıdaki kod parçasında açıkça görüldüğü gibi el ile çözdüğüm farklı bir özel derlemede tanımlanır.
Ben yanlış olduğu bu ifadeyi if (type.IsSubclassOf(...))
satırda kesme noktası koymak ve teyit ettik:
type.BaseType == typeof(ClientPlugin)
Öte yandan, bu ifade doğru:
type.BaseType.FullName == typeof(ClientPlugin).FullName
Bu nasıl mümkün olabilir ? Neler oluyor?
GÜNCELLEME: Kent Boogaart beni doğru yöne işaret etti. İnterneti biraz daha araştırdım ve this blog yayına girdim. Bunu yapmak için Load/LoadFrom/ReflectionOnlyLoadFrom çakışmalarımı çözmem gerekiyor gibi görünüyor.
Tam olarak bu sorun vardı, iki klasörde aynı DLL'nin iki kopyasını vardı. "IsSubclassOf" el ile çalıştırıldığında, bu hata iletisini aldım: 'ServiceCore.BaseService' türü 'ServiceCore.dll' ve 'ServiceCore.dll' hem de var – vpalmu