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.
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;
}
}
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.
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
but vis-a-versa is not possible automically.