我在调用DLL时出现这样的问题 请看代码:
aaa.DLL:
using System;
using System.Reflection;  //程序集
using System.Threading;namespace CheShidll
{
   public Class1(Object send)
   {
       //省略代码
   }
   public Obj ReceiveMoMessage(Object obj)
   {
       //省略代码
   }}
调用
dss = Assembly.LoadFile(@"D:、aaa.DLL);//读取程序集
foreach(Type dsstype in dss.GetTypes())
{
   Type[] chanshu=new Type[1]{typeof(Object)};
   ConstructorInfo ci=dsstype.GetConstructor(chanshu);
   Object[] ts=new object[1];
   ts[0]=new SendSms();
   user=ci.Invoke(ts);
   MethodInfo m=user.GetType().GetMethod("ReceiveMoMessage");
   m.Invoke(Activator.CreateInstance(user.GetType()),new object[] {momsg});
}
在 m.Invoke(Activator.CreateInstance(user.GetType()),new object[] {momsg});
这句出现 "没有为该对象定义无参数的构造函数。"提示
请问我应该怎么做?

解决方案 »

  1.   

    Activator.CreateInstance会调用dll中类的构造函数,如果你的类里面没有提供无参的构造函数,当然会出错。CreateInstance有很多个重载方法,应该在user.GetType(),后面加上你的构造函数的参数,系统会找到和你所列出的参数最匹配的类构造函数调用。
      

  2.   

    与要调用构造函数的参数数量、顺序和类型匹配的参数数组。如果 args 为空数组或空引用,则调用不带任何参数的构造函数(默认构造函数)。
    以上是MSDN中的,你明白你那里错了吧!
      

  3.   

    反射只能调用无参数构造函数 创建实例.
    若类里面要外部传进去的变量,只有在类里面在加一个公用的方法或写属性,
    然后调用 invoke 方法执行传进去.
    如下:
    Assembly _Assembly = Assembly.Load("程序集名");
    Type _Type = _Assembly.GetType("完整类名");
    Form _Form = (Form)Activator.CreateInstance(_Type);
    System.Reflection.EventInfo _EventInfo = _Type.GetEvent("RemoveFormHandler");_EventInfo.AddEventHandler(_Form, new Com.Psi.UIBase.RemoveFormDelegate(RemoveForm));System.Reflection.FieldInfo _FieldInfoSys = _Type.GetField("m_SysDataSet");
    _FieldInfoSys.SetValue(_Form, this.m_TableDataSet);_Form.Show()
      

  4.   

    user.GetType().GetMethod("ReceiveMoMessage");
    根据名称来查找所要的方法不是什么好做法。为什么不用接口?
    如果构造函数必须要有参数的话,怎么可能不给参数而创建一个对象呢?该怎么办只有你自己最清楚。