首页 新闻 会员 周边 捐助

反射的问题。。。。。

0
悬赏园豆:50 [已解决问题] 解决于 2013-12-05 08:08

我有一个dll文件利用反射拿到里面的方法  然后调用里面的方法获得我想要的值  ,我现在只有一个dll文件 求大神发点代码我该怎么做。。。。。

asp点net_菜鸟的主页 asp点net_菜鸟 | 初学一级 | 园豆:7
提问于:2013-12-04 13:20
< >
分享
最佳答案
0

             Assembly assembly = Assembly.LoadFile(path);
            //2创建Person类的对象
            Type type = assembly.GetType("MyAssembly.Person");
            object o = Activator.CreateInstance(type,"wolf",22,"未知");//实例化
            //3获取方法的类型
             MethodInfo methodInfo = type.GetMethod("SayHi");
            //4反射调用方法
             methodInfo.Invoke(o, null);

http://www.cnblogs.com/wolf-sun/p/3364009.html

收获园豆:50
wolfy | 老鸟四级 |园豆:2636 | 2013-12-04 13:35

MyAssembly.Person 这个是啥 type,"wolf",22,"未知");// 这些参数呢   SayHi还有这个

asp点net_菜鸟 | 园豆:7 (初学一级) | 2013-12-04 13:40

@asp点net_菜鸟: Type type=typeof(Person);相同

wolfy | 园豆:2636 (老鸟四级) | 2013-12-04 13:43
其他回答(7)
0

楼上的方法好像可以!

junjieok | 园豆:779 (小虾三级) | 2013-12-04 13:37
0

你最好把反射这一块系统的学习一下

Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-04 13:42
0

加载程序集,然后找程序集中相应的类,然后调用方法 就是这么简单。

ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");//要绝对路径
type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
或:string s = (string)method.Invoke(obj,Object[] parametors = new Object[]{"param"}); 
Response.Write(s+"<br>");
method = type.GetMethod("WriteName");//方法的名称
s = (string)method.Invoke(null,new string[]{"jianglijun"}); //静态方法的调用

http://www.cnblogs.com/baishahe/archive/2008/03/24/1120148.html 善用搜索引擎呐亲。

 

http://www.cnblogs.com/Ivan-Yan/archive/2011/02/13/1953044.html 4.0 还可以用 dynamic  更优雅的实现

Rookier | 园豆:652 (小虾三级) | 2013-12-04 13:42
0
chenping2008 | 园豆:9836 (大侠五级) | 2013-12-04 13:43

谢谢

支持(0) 反对(0) asp点net_菜鸟 | 园豆:7 (初学一级) | 2013-12-05 08:08
0
       //加载Dll
            Assembly _Assembly = Assembly.LoadFrom("ClassLibraryTest.dll");

            //获得指定类型(命名空间+类名称)
            Type T = _Assembly.GetType("ClassLibraryTest.Library");

            //获得实例对象
            object o = System.Activator.CreateInstance(T);

            //查找指定方法
            System.Reflection.MethodInfo mi = T.GetMethod("GetValue");

            //执行方法 
            string Result = mi.Invoke(o,null).ToString();

最好去MSDN去看看。上面有详细的解释和实例。

@Sunth | 园豆:134 (初学一级) | 2013-12-04 13:46

谢谢

支持(0) 反对(0) asp点net_菜鸟 | 园豆:7 (初学一级) | 2013-12-05 08:07
0
namespace AssembleTest
{
    public class Assemble
    {
        
        public string name = "I'm Zery";
        public int age = 22;
        public string sex = "Super Man";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public int Age {
            get { return age; }
            set { age = value; }
        }
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }

        public string PrintName(string name)
        {
            Console.WriteLine("这是反射调用的{0}", name);
            return name;
        }

        public void PrintAge(int age)
        {
            Console.WriteLine("这是反射调用的:{0}", age);
        }

        public string ReturnValue(int age, string name, string sex)
        {
            return string.Format("给反射的返回值:名字:{0},年龄:{1},性别{2}", name, age, sex);
        }

        public static void PrintSex(string sex)
        {
            Console.WriteLine("这是静态的方法:{0}", sex);
        }
    }
}



      //加载指定路径下的程序集
            Assembly assembly = Assembly.LoadFile(@"F:\TestFile\AssembleTest.dll");

            Assembly formAssembly = Assembly.LoadFrom(@"F:\TestFile\AssembleTest.dll");
            

            Type types = assembly.GetType("AssembleTest.Assemble");

            MethodInfo method = types.GetMethod("PrintName");
            MethodInfo staticMethod = types.GetMethod("PrintSex");
            
            //反射创建类的实例
            Object obj = assembly.CreateInstance("AssembleTest.Assemble"); //需要加名称空间
            //反射创建类的实例 
            //Activator: 在本地或从远程创建对象类型,或获取对现有远程对象的引用
            Object acrivatorObj = Activator.CreateInstance(types);
            
            //注意Invoke方法的两个参数,第一个为类的实例对象如果方法是静态的,则忽略此参数,第二个为方法的参数 
            method.Invoke(acrivatorObj, new object[] { "Zery" });
            
            //调用静态方法 第一个参数可以省略
            staticMethod.Invoke(null, new object[] { "" });

            //获取字段值
            FieldInfo field = types.GetField("name");
            var value = field.GetValue(obj);
            Console.WriteLine("这是字段值:{0}",value);

http://www.cnblogs.com/zery/p/3385107.html

代码来源于我的这篇文章,有详细的介绍关于反射的用法。包括调用方法,取字段的值等。

Zery | 园豆:6151 (大侠五级) | 2013-12-04 14:24

谢谢

支持(0) 反对(0) asp点net_菜鸟 | 园豆:7 (初学一级) | 2013-12-05 08:07
0

反编译之。。。。。。

iEvent | 园豆:529 (小虾三级) | 2013-12-04 15:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册