Receiving "unable to cast object of type... to type" message when using Reflection to load classes from dll files.

Hello, I am trying to load classes from dll files where the class implements the interface IBaseMod, and the class name exists in a Dictionary, objDict.

I am receiving an exception message:  "Exception: Unable to cast object of type 'PluginDll.MovingObect1' to type 'Base.IBaseMod'".

Please help. Below is the layout of the code I am using, and the exact commands I have tried.
//Main program - loads in *.dll files.
 
using System;
using System.Reflection;
using Base;
 
namespace PluginDll
{
    public class LoadMovingObjects : IBaseMod
    {       
    	//do stuff
    	
        public  bool InterfaceFilter(Type typeObj, Object criteriaObj)
	{
	    if (typeObj.ToString() == criteriaObj.ToString())
	        return true;
	    else
	        return false;
        }
        
        public void LoadDLLs(string directory, string chkInterface)
        {
            TypeFilter myFilter = new TypeFilter(InterfaceFilter);
            List<IBaseMod> modules = new List<IBaseMod>();
 
            foreach (string file in Directory.GetFiles(directory, "*.dll"))
            {
                Assembly componentAssembly = Assembly.LoadFrom(file);
                if (componentAssembly != null)
                {
                    try
                    {
                        foreach (Type componentType in componentAssembly.GetTypes())
                        {
                            Type[] InterfaceList = componentType.FindInterfaces(myFilter, chkInterface);
                            
                            {
                                if (InterfaceList.Length > 0)
                                {
                                    Console.WriteLine("\n{0} implements the interface {1}.", componentType.Name, chkInterface);
                                   
                                    foreach (KeyValuePair<int, string> kvp in objDict)
                                    {
                                        Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
                                        if (kvp.Value == componentType.Name)
                                        {
                                            int i = kvp.Key;
 
                                            Console.WriteLine("Found match: object {0} with class {1} ", objArray[i, 0], componentType.Name);
 
                                            //The following are the commands I have tried.
                                            
                                            //Object tempObj = Activator.CreateInstance(componentType);  //object is created.
                                            //IBaseMod movingObj = (IBaseMod)tempObj;   //however, receive "Unable to cast object message" here
                                            //Exception: Unable to cast object of type 'PluginDll.MovingObect1' to type 'Base.IBaseMod'.
                                            
                                            //These commands result in the same exception message:                                             
                                            //Type PluginType = componentAssembly.GetType(componentAssembly.GetName().Name + "." + componentType.Name, true, true);
                                            //IBaseMod movingObj = (IBaseMod)Activator.CreateInstance(PluginType);
                                            
                                            //Object tempObj = componentAssembly.CreateInstance("PluginDll.MovingObect1");  //object is created
                                            //IBaseMod movingObj = (IBaseMod)tempObj;   //however, receive "Unable to cast object message" here
 
 
 
					    //These are the only commands that will successfully create the instance and type cast the instance.
					    //As you can see, I have to type in the actual name.  
					    
                                            //PluginDll.MovingObect1 tempObj = new PluginDll.MovingObect1();
                                            //Base.IBaseMod movingObj = (Base.IBaseMod)tempObj;
 
                                            //MovingObect1 tempObj = new MovingObect1();
                                            //BaseMod movingObj = (IBaseMod)tempObj;
                                           
                                        
 
 
 
 
 
--------------------------------
 
//The Interface class
 
using System;
 
namespace Base
{
    public interface IBaseMod
    {
        Vector3 PositionFromDate(DateTime date);
        Vector3 PositionDelta(double timeDelta);
    }
}
 
---------------------------------
 
//The dll file that needs to be loaded
 
using System;
using Base;
 
namespace PluginDll
{
    public class MovingObect1 : IBaseMod
    {
        
        public MovingObect1()
        {
            Console.WriteLine("In MovingObect1 constructor");
        }
 
        Vector3 IBaseMod.PositionFromDate(DateTime date)
        {
            //Do stuff
            return positionVector;
        }
        Vector3 IBaseMod.PositionDelta(double timeDelta)
        {
            //Do stuff
            return positionVector;
        }
      
    }
 
    public class MovingObect2 : IBaseMod
    {
       
        public MovingObect2()
        {
            Console.WriteLine("In MovingObect2 constructor");
        }
 
        Vector3 IBaseMod.PositionFromDate(DateTime date)
        {
            //Do stuff
            return positionVector;
        }
        Vector3 IBaseMod.UpdatePosition(double timeDelta)
        {
            //Do stuff
            return positionVector;
        }
        
    }

Open in new window

weledaAsked:
Who is Participating?
 
weledaConnect With a Mentor Author Commented:
I found the solution.  The code that loads the assemblies and the interface used for typecasting can not be compiled in the same project.

I found my answer here:
http://www.geocities.com/jeff_louie/OOP/oop13.htm
and here:
http://www.yoda.arachsys.com/csharp/plugin.html
0
 
divyeshhdoshiCommented:
You could not cast child object to parent object, you can cast parent object to child object.
but vis-a-versa is not possible automically.


0
 
weledaAuthor Commented:
I can cast the object if I use the exact name of the class:
PluginDll.MovingObect1 tempObj = new PluginDll.MovingObect1();
Base.IBaseMod movingObj = (Base.IBaseMod)tempObj;

However I can not cast the object dynamically, this is my problem.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.