你在VisualStudio下还是添加WPF2.MyDll.dll引用,(也同样把它嵌入资源)。
去掉那些反射调用的代码(不需要)。
添加自定义assembly解析: AppDomain.CurrentDomain.AssemblyResolve += ...;
发布时,不要拷贝WPF2.MyDll.dll。

解决方案 »

  1.   


    不可能写明 Student,你只能一直以含混的反射方式去使用你的 obj 变量,因为你的宿主程序根不能知道什么 Student 类型(如果知道,你还反射干什么?)。当然你可以以接口设计方式来,录入IStudent obj = (IStudent)System.Activator.CreateInstance(type); //⑥这样可以说是强类型的 obj,写明了接口。尽量少用反射。真正善用反射的人,绝不会滥用反射。在几千行代码中有那么3、4行代码涉及反射而已。一切还是要以强类型编程出发。
      

  2.   

    不能,因为反射并不知道具体的类,类的对象只能是object,要访问成员就只能通过GetProperty获取属性、Invoke调用方法
      

  3.   

    简单地说,就是无法在反射的代码里直接定义Student stu或MyDll.Student stu,除非“引用WPF2.MyDll.dll”;所以,你可以这样理解,在反射的代码里只存在字符串描述的类,而不存在具体的类
      

  4.   

    阁下,我想请问一下,你说的意思是不是既要添加MyDll.dll引用,同时还要把它嵌入资源,是这样的吗?
    添加自定义assembly解析: AppDomain.CurrentDomain.AssemblyResolve += ...;这是怎么回事呢,具体这是怎么做的呢,请问?
    谢谢
      

  5.   

    一个技巧就是在主程序中定义一个接口,让dll实现这个接口,这是避免反射最好的方式。
      

  6.   

    你的意思是不是指的:在主程序中定义一个接口,然后让Dll中的Student类继承自这个接口呢?
    主程序中定义的接口,Dll中的Student类怎么那个做到继承自这个接口呢?
    还请说细一点,谢谢!
      

  7.   

    对于 Student 如果想使用 Strongly Typed 对象来使用的话,就需要定义接口 (Contract) 了,即被引用类型和引用类型使用同一个类型接口
    创建子类型对象可以这样做:
                Type studentType = System.Reflection.Assembly.Load(Resources.SampleLibrary).GetType("SampleLibrary.Class1").GetNestedType("Student");
                object student = Activator.CreateInstance(studentType);
      

  8.   

    IStudent 定义在 Library Contracts.dll 中,然后调用者 Application.exe 引用 Contracts.dll, 被调用者 Library.dll 也引用这个 Contacts.dll,在 Application.exe 中使用 Contracts.dll 中定义的 IStudent 接口来操作反射创建出来的对象实例
    IStudent student = (IStudent) Activator.CreateInstance(studentType); 
      

  9.   

    可以用dynamic试试,前提是你使用.net 4.0或更高版本。dynamic obj = Activator.CreateInstance(type);
    textBox1.Text = obj.GetText();
      

  10.   

    你的意思是除了主程序,还要创建2个Dll吗?一个是被主程序引用的Dll,另一个是装接口的Dll吗?
    能说具体点吗?
      

  11.   

    你的意思是除了主程序,还要创建2个Dll吗?一个是被主程序引用的Dll,另一个是装接口的Dll吗?
    能说具体点吗?
    是的,你需要定义一个 DLL 来包含哪些做为契约的接口或者类型,然后调用者(EXE)和被调用者(你实际上想要调用的 DLL)共同引用这个 DLL。
      

  12.   

    比如说:
    Contract.dll 里面定义一个 IStudent
    public inteface IStudent { void DoSomething(); }Library.dll 里面定义包含具体实现内容的类 Student
    public class Student : IStudent { public void DoSomething() {} }Application.exe 里面通过反射创建对象
    Type studentType = System.Reflection.Assembly.LoadFile(“Library.dll”).GetType("Library.Class1").GetNestedType("Student");
    IStudent student = (IStudent) Activator.CreateInstance(studentType); 这样你就可以调用 Library.dll 里面定义的 Student 类型的具体实现了。虽然 Application.exe 不知道 Student 这个类型的具体实现,但是他知道 Student 实现了 IStudent 接口,于是他就知道了 Student 里面有一个叫 DoSomething 的方法,于是就可以调用了。
      

  13.   

    楼上的朋友所说的,并没有解决我的问题诶。
    我的目的是想从网上获取一个二进制的Student数据,然后,在本地使用,但是,在客户端又不愿意采用"引用"的方式来使用Dll,而是采取将Dll作为资源嵌入到应用程序中的方式,但是,这样的话,获取到的二进制Student,无法还原成Student对象。
    采用资源嵌入Dll的方式,这样,就可以只分发exe一个文件给用户,无需安装就可以直接运行exe,这是我的初衷。
      

  14.   

    no zuo no die, 直接合并程序集不就可以了!
      

  15.   

    那你的问题是在哪里?从网络获取数据?数据的反序列化?嵌入的 DLL 如何被调用?还是契约该如何建立?
    我回答的是契约如何建立的问题,是针对你 8 楼的提问回复的
    如果你问的是嵌入的 DLL 该怎么被调用,而不是能不能以强类型方式进行调用的话,那这样创建对象就可以
                Type studentType = System.Reflection.Assembly.Load(Resources.SampleLibrary).GetType("Library.Class1").GetNestedType("Student");
                IStudent student = (IStudent) Activator.CreateInstance(studentType); 
    Resources 是你资源文件的名字,也是 VS 为 Resources.resx 创建的代理类型。