2009-01-21 32 views
5

我在用下面的代碼一些問題:Type.IsSubclassOf()不適用於AppDomains?

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 

這怎麼可能?這是怎麼回事?

更新:肯特Boogaart指出我正確的方向。我在網上搜索了一下,並碰到this博客文章。看來我將不得不解決我的Load/LoadFrom/ReflectionOnlyLoadFrom衝突,以使這項工作。

回答

7

這是由於加載到不同的上下文。如何加載程序集(Load/LoadFrom/ReflectionOnlyLoad)確定將其加載到哪個上下文中。這個簡單的例子也說明了這個問題:

using System; 
using System.Reflection; 

class Foo 
{ 
    public static void Main() 
    { 
     var type = typeof(Foo); 
     var reflectionLoadType = Assembly.ReflectionOnlyLoad("ConsoleApplication1").GetType("Foo"); 
     Console.WriteLine(type == reflectionLoadType); //false 
     Console.WriteLine(type.Equals(reflectionLoadType)); //false 

     Console.WriteLine("DONE"); 
     Console.ReadKey(); 
    } 
} 

更多信息,請參見here

2

我有過類似的問題。我也有這個架構 - 一個包含ClientPlugin基類的DLL。幾個插件引用這個.DLL;和一個主要應用程序,它也引用了這個.DLL。問題是具有ClientPlugin基類的.DLL被複制到兩個文件夾 - Plugins文件夾和主應用程序文件夾中。因此它在我的AppDomain中加載了兩次(插件也間接加載了它)。當主應用程序試圖做反射型魔術時,它失敗了,因爲有兩個ClientPlugin類型的實例。

儘管我不認爲這完全是你的情況,但仍然有一個教訓要學習 - 如果.DLL被加載兩次,類型也將被複制。在你的情況下,我會懷疑單獨的AppDomains或「ReflectionOnlyLoad」,因爲.DLL然後以某種方式加載不同。

+0

我有這個問題,我有兩個相同的DLL在兩個文件夾中的副本。當手動執行「IsSubclassOf」時,我收到了以下錯誤消息:「ServiceCore.dll」和「ServiceCore.dll」中都存在類型「ServiceCore.BaseService」 – vpalmu 2016-08-04 06:57:19

相關問題