Link to home
Start Free TrialLog in
Avatar of weleda
weleda

asked on

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

Avatar of divyeshhdoshi
divyeshhdoshi

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.


Avatar of weleda

ASKER

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.
ASKER CERTIFIED SOLUTION
Avatar of weleda
weleda

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial