2010-03-05 51 views
1

我有2個文件MyBaseClass.cs和MyScript.cs都與命名空間MainProject主DLL Main.dll:C#反思:在外部DLL類派生

public class MyBaseClass 
{ 
    public string name ; 

    public MyBaseClass() 
    { 
     name = "base class" ; 
    } 
} 

接下來我做了第二DLL插件.dll文件(使用MainProject)的命名空間子項目

public class MySubClass : MyBaseClass 
{ 
    public MySubClass() 
    { 
     name = "sub class" ; 
    } 
} 

我想要做的就是在加載的MyScript第二DLL,然後實例化MySubClass並投它作爲MyBaseClass

public class MyScript 
{ 

public static void init() 
    { 

     string myPath = ".../addOn.dll" ; 
     Assembly testAssembly = System.Reflection.Assembly.LoadFrom(myPath) ; 

     //i retrieve types in external Assembly  
     Type[] myTypes = testAssembly.GetExportedTypes() ; 

     for(int i = 0; i < myTypes.Length; ++i)  
     { 
      //instanciate type => there is only MySubClass 
      System.Object testObj = testAssembly.CreateInstance(myTypes[i].ToString()) ; 
      Debug.Log(testObj) ; //=> print SubProject.MySubClass 
      Debug.Log(myTypes[i].BaseType) ; //=>print MainProject.MyBaseClass 
      Debug.Log(myTypes[i].IsSubclassOf(typeof(MainProject.MyBaseClass))) ; 
      //=> print False. => It's seems that mySubClass doesn't derive from MyBaseClass anymore ? 

      //cast 
      MyBaseClass testCastObj = testObj as MyBaseClass; 
      Debug.Log(testCastObj) ; //print null (cast fail) 

      //test if properties are well retrieved 
      PropertyInfo[] propList = testObj.GetType().GetProperties() ; 
      for(int j = 0; j < propList.Length; ++j) 
      { 
       Debug.Log(propList[j].Name.ToString()) ; //print name, it's ok  
      } 
     } 
    } 
什麼

}

所以我成功的實例我MySubClass,但沒有保留遺產與MyBaseClass(或只是我投這是不對的......不知道)這是沒有用的。

他的任何人都有正確的方法來做到這一點?

+0

在您使用類'Shoot.Ship'的'init'方法中,您已經顯示了'MyBaseClass'和'MySubClass'的定義。任何關係? – 2010-03-05 10:33:32

+0

這只是一個錯過,當我複製我的真實項目代碼到這個樣本;) – Mickael 2010-03-05 10:47:35

回答

0

也許addon.dll使用main.dll的本地副本。
如果將兩個dll放在同一個文件夾中,會發生什麼情況?

+0

是的,謝謝它的工作:) – Mickael 2010-03-05 10:45:42

0

您是否有不同版本的Main.dll浮動,偶然?在這種情況下,addon.dll可能會定義從MyBaseClass繼承的類型(在Main.dll V 1.0.0.0中),並嘗試將其轉換爲MyBaseClass(在Main.dll V 1.1.0.0中) - 這是行不通的。

讓我作爲旁註添加,如果可能的話,我建議不要滾動自己的插件框架。有很多現成的解決方案或優秀的框架可以讓你的工作更輕鬆。

+0

好的謝謝,我會檢查! – Mickael 2010-03-05 10:46:44