你在VisualStudio下还是添加WPF2.MyDll.dll引用,(也同样把它嵌入资源)。
去掉那些反射调用的代码(不需要)。
添加自定义assembly解析: AppDomain.CurrentDomain.AssemblyResolve += ...;
发布时,不要拷贝WPF2.MyDll.dll。
去掉那些反射调用的代码(不需要)。
添加自定义assembly解析: AppDomain.CurrentDomain.AssemblyResolve += ...;
发布时,不要拷贝WPF2.MyDll.dll。
解决方案 »
- GMap.NET 1.6版本的查找功能
- 写了一个异步客户端程序的一个类,如何将接收到的信息返回调用它的窗口
- .Net软件在Wndows 7平台下有优势吗?
- 对所有 CSDNER 的建议
- .net下调用com+
- winform中如何关闭子窗口frmData的同时,执行主窗口的方法?
- 关于Excel文件com模式读写多版本Excel的问题
- dbgrid 的问题
- 求助c# treeview点击节点出错
- 保存后的图片比原来的图片大一点
- DataGridView显示数据库数据的问题
- Jmail 问题收发邮件报错检索 COM 类工厂中 CLSID 为 {F812B147-0E26-4222-8EE4-9F753CD2B39C} 的组件时失败
不可能写明 Student,你只能一直以含混的反射方式去使用你的 obj 变量,因为你的宿主程序根不能知道什么 Student 类型(如果知道,你还反射干什么?)。当然你可以以接口设计方式来,录入IStudent obj = (IStudent)System.Activator.CreateInstance(type); //⑥这样可以说是强类型的 obj,写明了接口。尽量少用反射。真正善用反射的人,绝不会滥用反射。在几千行代码中有那么3、4行代码涉及反射而已。一切还是要以强类型编程出发。
添加自定义assembly解析: AppDomain.CurrentDomain.AssemblyResolve += ...;这是怎么回事呢,具体这是怎么做的呢,请问?
谢谢
主程序中定义的接口,Dll中的Student类怎么那个做到继承自这个接口呢?
还请说细一点,谢谢!
创建子类型对象可以这样做:
Type studentType = System.Reflection.Assembly.Load(Resources.SampleLibrary).GetType("SampleLibrary.Class1").GetNestedType("Student");
object student = Activator.CreateInstance(studentType);
IStudent student = (IStudent) Activator.CreateInstance(studentType);
textBox1.Text = obj.GetText();
能说具体点吗?
能说具体点吗?
是的,你需要定义一个 DLL 来包含哪些做为契约的接口或者类型,然后调用者(EXE)和被调用者(你实际上想要调用的 DLL)共同引用这个 DLL。
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 的方法,于是就可以调用了。
我的目的是想从网上获取一个二进制的Student数据,然后,在本地使用,但是,在客户端又不愿意采用"引用"的方式来使用Dll,而是采取将Dll作为资源嵌入到应用程序中的方式,但是,这样的话,获取到的二进制Student,无法还原成Student对象。
采用资源嵌入Dll的方式,这样,就可以只分发exe一个文件给用户,无需安装就可以直接运行exe,这是我的初衷。
我回答的是契约如何建立的问题,是针对你 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 创建的代理类型。