首页 新闻 会员 周边

关于反射的一个问题,懂得进来帮我看下代码!!!!!!!!

0
悬赏园豆:50 [已解决问题] 解决于 2010-01-05 10:38

程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Reflection;

namespace Test
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private object Invoke(string lpFileName, string Namespace, string ClassName, string lpProcName)
        {
            try
            { // 载入程序集
                Assembly MyAssembly = Assembly.LoadFrom(lpFileName);
                Type[] type = MyAssembly.GetTypes();
                foreach (Type t in type)
                {// 查找要调用的命名空间及类
                    if (t.Namespace == Namespace && t.Name == ClassName)
                    {// 查找要调用的方法并进行调用
                        MethodInfo m = t.GetMethod(lpProcName);
                        if (m != null)
                        {
                            object o = Activator.CreateInstance(t);
                            return m.Invoke(o, null);
                        }
                        else MessageBox.Show(" 装载出错 !");
                    }
                }
            }//try
            catch (System.NullReferenceException e)
            {
                MessageBox.Show(e.Message);
            }//catch
            return (object)0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(" 点击获取字符串 " + Invoke("DataLogic.dll", "DataLogic", "Form1", "getArray").ToString());
        }
    }
}

被调用的DLL程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace DataLogic
{
    public partial class Form1 : Form
    {
       

        public Form1()
        {
            InitializeComponent();

  }

         public string getArray()
        {

            string va = "aaaaaa";
            return va;
        }

我只是想反射得到getArray()方法里“aaaaaa”,不知道为什么object o = Activator.CreateInstance(t);报错,我不知道错在哪了,大家帮我看下。

大草包的主页 大草包 | 小虾三级 | 园豆:1745
提问于:2010-01-04 10:51
< >
分享
最佳答案
0

你的代码没有问题,我试过,再查查dll的引用,invoke的参数是否传对了。

收获园豆:30
学而思,不进则退 | 菜鸟二级 |园豆:419 | 2010-01-04 11:16
什么参数?
大草包 | 园豆:1745 (小虾三级) | 2010-01-04 11:21
为什么你这里运行就不会报错?你没改过东西?
大草包 | 园豆:1745 (小虾三级) | 2010-01-04 11:35
你有怎么写的,发上来看看!!!!!!!
大草包 | 园豆:1745 (小虾三级) | 2010-01-04 11:39
其他回答(1)
0
利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名
 
 
加载dll后,需要使用dll中某类.
Type type=ass.GetType(TypeName);//利用类型的命名空间和名称获得类型
 
需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
 
调用类型中的某个方法:
需要首先得到此方法
MethodInfo mi=type.GetMethod(MehtodName);//通过方法名称获得方法
 
然后对方法进行调用,多态性利用参数进行控制
mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值
收获园豆:20
一滴血 | 园豆:1602 (小虾三级) | 2010-01-04 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册