C#反射:外部dll中的类派生

时间:2010-03-05 10:25:49

标签: c# reflection assemblies

我有一个带有2个文件的主dll Main.dll MyBaseClass.cs和MyScript.cs都带有命名空间MainProject:

public class MyBaseClass
{
    public string name ;

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

接下来我用命名空间SubProject做了第二个dll addOn.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的遗产(或者只是我的演员是错误的......不知道)这是没用的。

他的任何人都有正确的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

你有不同版本的Main.dll漂浮在附近吗?在这种情况下,addon.dll可能会定义一个继承自MyBaseClass的类型(在Main.dll V 1.0.0.0中),并且您尝试将其强制转换为MyBaseClass(在Main.dll V 1.1.0.0中) - 这将无效。 / p>

让我作为旁注添加,如果可能的话,我建议不要滚动自己的插件框架。有很多现成的解决方案或良好的框架,使您的工作更轻松。

答案 1 :(得分:0)

也许addon.dll正在使用main.dll的本地副本 如果将两个dll放在同一个文件夹中会发生什么?