一个简单的类如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace ReflectionSample
{
    
    public class ClassSample
    {
        // 默认构造
        public ClassSample()
        {
            this.name = "您调用了默认构造创建了一个类实例。";
        }        // 带参构造
        public ClassSample(string name)
        {
            this.name = name;
        }        // 字段 
        public string name;        
}
编译为:ReflectionSample.dll
将ReflectionSample.dll作为引用加入到一个控制台程序中,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using ReflectionSample; //使用此命名空间!!!!namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 获取程序集
            Assembly classSampleAssembly = Assembly.LoadFrom(@"D:\ReflectionSample.dll");
            // 从程序集中获取指定对象类型
            Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");
            Console.WriteLine(classSampleType.FullName.ToString());
            
            // 通过对象类型创建对象实例
            ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;
            Console.WriteLine(s1.name + "(使用Activator创建一个实例)");                                    Console.ReadLine();            
        }
    }
}
ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;
上面这行程序运行结束后 s1为null
运行到:
Console.WriteLine(s1.name + "(使用Activator创建一个实例)");                        
就报错误。Activator.CreateInstance()返回的是object,把其转为ClassSample吗?

解决方案 »

  1.   

    强制转换试一下ClassSample s1 = (ClassSample)Activator.CreateInstance(classSampleType);
      

  2.   

    if (objs == null)
        objNewObject = objAssembly.CreateInstance(objClassName);
    {
        objNewObject = objAssembly.CreateInstance(objClassName, false,
                         BindingFlags.CreateInstance,
                         null, objs, null, null);         
    }
      

  3.   

    产生错误的原因是已经加载了一个ReflectionSample,就是你引用的那个Dll,这个Dll程序集在程序启动的时候会自动被载入,这时候你再从D:\ReflectionSample.dll又载入一个程序集,这时候做这样的转换:
    ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;
    系统会认为你要将从D:\ReflectionSample.dll程序集中创建的类型反射出来的实例转换成你引用的那个Dll程序集中的ClassSample,转换就不会成功,所以s1是null知道了原因,解决的办法就容易了
    将Assembly classSampleAssembly = Assembly.LoadFrom(@"D:\ReflectionSample.dll");
    改成Assembly classSampleAssembly = Assembly.GetAssembly(typeof(ClassSample));
    后一句的意思获取定义了ClassSample类的已加载的程序集,当然就是你在工程中引用的那个Dll了
      

  4.   

    请问: yangglemu如果使用Assembly classSampleAssembly = As sembly.LoadFrom(@"D:\ReflectionSample.dll");
    且程序中没有引用:ReflectionSample.dll,这时如何创建ClassSample的对象实例?
      

  5.   

    Assembly classSampleAssembly = Assembly.LoadFrom(@"D:\ReflectionSample.dll");
    改为你引用后此dll所在项目中的地址
      

  6.   


    深思好问的同学,结贴了也再讲点,不是为了分建立一个Dll工程,内容如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace MyClass
    {
        public class Class1
        {
            public void Test()
            {
                Console.WriteLine("test");
            }
        }
    }
    将编译好的Dll得到到D盘根目录
    建立一个控制台应用程序,内容如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly a = Assembly.LoadFrom(@"D:\MyClass1.dll");
                Type t = a.GetType("MyClass.Class1");
                Object o = Activator.CreateInstance(t);
                MethodInfo m = t.GetMethod("Test");
                m.Invoke(o, null);
            }
        }
    }
    运行,输出test,说明我们调用Dll中的方法是正确的
    这说明什么?
    说明通过.Net的反射机制,我们可以达到更换Dll去改变程序功能的目的,而不用去修改已有的任何代码
    如果将多个类似功能的Dll放在一起,通过配置文件指定Assembly.LoadFrom(string fileName)来指定fileName参数,或者弹出一个对话框,让用户选择使用什么功能,就加载对应功能的Dll,这说明什么?
    说明后期的维护工作就只是更换或者添加一些Dll而已,呵呵,这也是所有程序员的心愿
      

  7.   

    明白了。
    yangglemu 你说的很好! 才人!不为分回帖的模范!闲暇时光不想浪费吗?用《Csdn收音机》找个话题聊聊技术吧!