Reputation: 63126
I have an application that uses plugins that are managed via an interface I then dynamically load the plugin classes and cast them to the interface to work with them.
I have the following line of code, assume that IPlugin is my interface.
IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)
This should be pretty simple, create the instance and cast it to the interface. I know that the assembly and fully qualified name values are correct, but I am getting the following exception.
Exception= System.InvalidCastException: Unable to cast object of type ‘System.Runtime.Remoting.ObjectHandle’ to type ‘MyNamespace.Components.Integration.IPlugin’. at MyNamespace.Components.Integration.PluginProxy..ctor(Int32 instanceId)
Any ideas what could cause this?
Upvotes: 7
Views: 2591
Reputation: 887449
As you can see in the documentation, this overload returns an ObjectHandle
object that wraps the new instance.
The ObjectHandle
cannot be casted directly to your interface.
Instead, you need to call the Unwrap
method, like this:
IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();
Upvotes: 7
Reputation: 57939
The exception indicates that you're getting an ObjectHandle
, which suggests that your object is being marshaled and must be unwrapped.
Try the following
ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly, Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
Upvotes: 12