反射的铸造误差

Mit*_*ers 7 c# reflection interface

我有一个使用通过接口管理的插件的应用程序然后动态加载插件类并将它们转换为接口以使用它们.

我有以下代码行,假设IPlugin是我的界面.

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)
Run Code Online (Sandbox Code Playgroud)

这应该非常简单,创建实例并将其强制转换为接口.我知道程序集和完全限定的名称值是正确的,但我得到以下异常.

Exception = System.InvalidCastException:无法将类型为"System.Runtime.Remoting.ObjectHandle"的对象强制转换为"MyNamespace.Components.Integration.IPlugin".at MyNamespace.Components.Integration.PluginProxy..ctor(Int32 instanceId)

有什么想法会导致这种情况吗?

Jay*_*Jay 12

该异常表示您正在获取ObjectHandle,这表明您的对象正在被封送并且必须被解包.

请尝试以下方法

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly,  Info.FullyQualifiedName);
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 7

正如您在文档中看到的,此重载返回一个包装新实例的ObjectHandle对象.

ObjectHandle不能直接铸造到你的界面.
相反,您需要调用Unwrap方法,如下所示:

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();
Run Code Online (Sandbox Code Playgroud)