Solved

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

Posted on 2008-10-16
3
1,149 Views
Last Modified: 2013-12-14
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

0
Comment
Question by:weleda
  • 2
3 Comments
 
LVL 6

Expert Comment

by:divyeshhdoshi
ID: 22738261
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
 

Author Comment

by:weleda
ID: 22741344
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
 

Accepted Solution

by:
weleda earned 0 total points
ID: 22749971
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

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

In our object-oriented world the class is a minimal unit, a brick for constructing our applications. It is an abstraction and we know well how to use it. In well-designed software we are not usually interested in knowing how objects look in memory. …
Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to use and create new code templates in NetBeans IDE 8.0 for Windows.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now