C# 以类的实例作为参数进行动态方法调用

C# 以类的实例作为参数进行动态方法调用,c#,methods,invoke,C#,Methods,Invoke,我有一个应用程序,加载给定的DLL,通过反射发现其方法,然后尝试动态调用DLL中的特定方法,即。, method.Invoke(dll,parms) 其中“parms”是具有单个成员的对象[]。如果参数是一个简单的内在类型(long、double等),那么这种方法可以很好地工作。例如,我可以通过这种方式加载和调用各种数学方法 当我试图将类的实例(在DLL中定义)作为参数传递时,就会出现问题,例如 namespace NS { public class ABC {

我有一个应用程序,加载给定的DLL,通过反射发现其方法,然后尝试动态调用DLL中的特定方法,即。,
method.Invoke(dll,parms)
其中“parms”是具有单个成员的对象[]。如果参数是一个简单的内在类型(long、double等),那么这种方法可以很好地工作。例如,我可以通过这种方式加载和调用各种数学方法

当我试图将类的实例(在DLL中定义)作为参数传递时,就会出现问题,例如

namespace NS
{
    public class ABC
    {
        public long n;

        public ABC ( long i )
        {
            n = i;
        }
    }
}
因此,
parms[0]
包含
新ABC(4)
。在本例中,我得到以下异常:

Object of type 'NS.ABC' cannot be converted to type 'NS.ABC'.
这样行吗?错误消息到底想告诉我什么?(被调用的方法期望ABC作为其第一个/唯一的参数,我在运行时通过
method.GetParameters()
在代码中验证)


(非常简短的代码)

要调用,我在“方法”中按名称查找所需的方法,然后:

var parms = new object[] { new ABC ( 4 ) };
return method.Invoke ( dll, parms );

通过反射创建参数实例,即通过从DLL获取ConstructorInfo,解决了这个问题。也就是说,我调用
dll.GetType().GetConstructors()
,找到我需要的(按类名),然后调用
constructor.Invoke(新对象[]{arg})
来创建对象。

显示调用代码so
instance.GetType()!=类型(ABC)
?您创建实例的方式是否有些奇怪?您是否以某种方式加载了程序集两次?您的代码声明了NS.ABC。DLL的代码还声明NS.ABC。框架认为这两种类型是不同的(有几种方法可以实现)。您需要分别定义NS.ABC并使两个程序集引用相同的定义。您可能会发现使用
接口而不是类是有效的better@Flydog57ABC没有声明两次,只在DLL中声明。@JeremyLakeman实例是用新的ABC(4)创建的。没有两次加载DLL。
var parms = new object[] { new ABC ( 4 ) };
return method.Invoke ( dll, parms );