1

希望有人可以在这里帮助我。基本上我必须动态加载 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 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”。存在显式转换(您是否缺少演员表?)“)

但我不知道如何让它转换为正确的类型。

请注意,我加载的外部程序集是第 3 方,我没有它们的标题或声明,我可以访问它们,但我没有声明的接口或类可以轻松转换,我必须动态进行。

将非常感谢任何指导。我已经查看和搜索了很多,并在“委托”上看到了很多,但我看到的最多的是进行调用和传递值,而不是处理返回和使用的动态用户类型值。

谢谢你的帮助。

//已编辑:if语句中有错误,对于那些已经响应的人感到抱歉,一定是:if(intObj == null)而不是if(CreateTheObjectMethod == null)

这可能会有所帮助,这基本上是我正在调用的方法的声明

[System.Reflection.RuntimeMethodInfo] = {IIReturnInterfaceDecl CreateTheObjectMethod(System.String, System.String)}
4

2 回答 2

0

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

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

于 2013-04-10T10:52:38.550 回答
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;

                }
于 2013-04-10T10:51:44.137 回答