加载程序集调用方法返回自定义类型

时间:2013-04-10 10:31:04

标签: c# reflection return-value usertype

希望有人能在这里帮助我。基本上我必须动态加载2个程序集,例如

ObjA= Assembly.LoadFrom(folder + module); //had the main methods of the integration
ObjB = Assembly.LoadFrom(folder + module_decl); //has more interface declarations for the intigration

现在ObjB具有objA中方法的返回值声明。因此,我首先尝试找到这个返回值并创建一个Type,例如

  Type intObj ;

   Type[] type2 = objB.GetTypes();

       foreach (Type t in type2)
            {
                if ((intObj == null) && (t.FullName == "IIReturnInterfaceDecl"))
                {

                    intObj = t;

                }
            }

然后我去创建一个主类的实例并调用方法

foreach (Type t in types)
                {

                mi = t.GetMethod("CreateTheObjectMethod");

                if (mi != null)
                {
                    string typeName = t.FullName;
                    object lateBoundObj = null;
                    lateBoundObj = Activator.CreateInstance(t);


                    intObj = lateBoundObj.GetType().InvokeMember("CreateTheObjectMethod",
                                                //BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance,
                                                BindingFlags.InvokeMethod | BindingFlags.GetProperty,
                                                    null,
                                                        lateBoundObj,
                                                            args);


                    if (intObj == null)
                    {
                        MessageBox.Show("oops");
                    }
                    else
                    {
                        MessageBox.Show("done");
                    }
                    //
                   // break;

                }
                //result
            }
        }
        else
        {
            MessageBox.Show("DAMMIT");
        }

但基本上我不能让它调用方法并以我想要的方式返回对象,(上面的代码不编译会给出错误

  

错误1无法将类型'object'隐式转换为'System.Type'。一个   存在显式转换(您是否错过了演员?)“)

但我不知道怎么把它变成正确的类型。

注意我加载的外部程序集是第三方,我没有它们的头文件或声明我可以访问它们但是我没有声明我可以轻松地转换的接口或类,我必须动态地执行它

非常感谢任何指导。我已经查看并搜索了很多,并且在'Delegate'上看到了很多,但我看到的最多的是进行调用并传递值而不是为了处理动态用户类型值而返回并使用它们。

感谢您的帮助。

// EDITED:在if语句中有错误,对于那些已经响应的人来说很抱歉,一定是:if(intObj == null)而不是if(CreateTheObjectMethod == null)

这可能会有所帮助,这基本上就是我调用的方法

的声明
[System.Reflection.RuntimeMethodInfo] = {IIReturnInterfaceDecl CreateTheObjectMethod(System.String, System.String)}

2 个答案:

答案 0 :(得分:0)

你试过这样的事吗?

                mi = t.GetMethod("CreateTheObjectMethod");

                if (mi != null)
                {
                    string typeName = t.FullName;
                    object lateBoundObj = null;
                    lateBoundObj = Activator.CreateInstance(t);

                    object returnValue = mi.Invoke(lateBoundObj,null);//pass your params instead of null if you need
                    //here you can check what return value is.
                    Type returnedType = returnValue.GetType();


                    if (CreateTheObjectMethod== null)
                    {
                        MessageBox.Show("oops");
                    }
                    else
                    {
                        MessageBox.Show("done");
                    }
                    //
                   // break;

                }

答案 1 :(得分:0)

intObj的类型为System.Type,您尝试将InvokeMember的返回值分配给它。但返回值为object。这就是错误消息告诉你的内容。

您可以简单地将返回值转换为Type,但我怀疑这是正确的。这将消除编译器错误,但如果调用的方法(CreateTheObjectMethod)的返回值不是Type类型,则会在运行时导致异常。
您需要将返回值分配给返回类型CreateTheObjectMethod的变量,并相应地转换InvokeMember的返回值。