【问题标题】:Casting Error with Reflection反射铸造错误
【发布时间】:2011-02-07 15:54:19
【问题描述】:

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

我有下面这行代码,假设IPlugin是我的接口。

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName)

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

异常= System.InvalidCastException:无法 类型的转换对象 'System.Runtime.Remoting.ObjectHandle' 输入 'MyNamespace.Components.Integration.IPlugin'。 在 MyNamespace.Components.Integration.PluginProxy..ctor(Int32 instanceId)

有什么可能导致这种情况的想法吗?

【问题讨论】:

    标签: c# reflection interface


    【解决方案1】:

    异常表明您收到ObjectHandle,这表明您的对象正在编组并且必须解包。

    试试下面的

    ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly,  Info.FullyQualifiedName);
    IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap();
    

    【讨论】:

      【解决方案2】:

      正如您在documentation 中看到的,此重载返回一个包装新实例的ObjectHandle object

      ObjectHandle 不能直接投射到您的界面。
      相反,您需要调用Unwrap method,如下所示:

      IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap();
      

      【讨论】:

      • 他不需要先转换为ObjectHandle,才能转换为Unwrap()吗?
      • @Jay:不;它被声明为返回ObjectHandle。阅读文档。
      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多