如何将松散的dll打包进需要发布的exe
2014-05-11 17:13
465 查看
我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出,我在实践的过程中遇到的几点问题,现在记录下总体的流程和该注意的事项。
2.在Class1中添加一个公开的方法:HelloWrold,并且返回一个字符串。
2.把ClassLibrary1复制到项目中,右键dll,选择生成方式为:嵌入的资源
3.打开Form1的后台代码,修改成:
4.使用作者提供的代码,原理就是:绑定在应用程序发生程序集解析失败的时候触发的事件,在绑定方法中获取自身exe的资源,并且加载。打开Program类,修改成:
这里要注意的是(WindowsFormsApplication1.)这个是需要改动的点,就是dll在exe资源中的前缀名称,大家可以使用反编译工具查看exe资源,然后再修改。
5.测试
找到bin目录下,把exe文件拷贝到桌面或者其他地方(没有依赖的dll,这里是没有ClassLibrary1.dll的地方),运行。
大功告成!
注意事项:
下面提供的是Winform和WPF的示例源码:源码下载
一.新建需要使用的类库:
1.打开VS,新建类库,使用默认的ClassLibrary1名称。2.在Class1中添加一个公开的方法:HelloWrold,并且返回一个字符串。
二.以Winform为例来写个exe程序。
1.添加ClassLibrary1dll的引用:2.把ClassLibrary1复制到项目中,右键dll,选择生成方式为:嵌入的资源
3.打开Form1的后台代码,修改成:
public partial class Form1 : Form { public Form1() { InitializeComponent(); ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1(); MessageBox.Show(c1.HelloWrold()); } }
4.使用作者提供的代码,原理就是:绑定在应用程序发生程序集解析失败的时候触发的事件,在绑定方法中获取自身exe的资源,并且加载。打开Program类,修改成:
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { String resourceName = "WindowsFormsApplication1." + new AssemblyName(args.Name).Name + ".dll"; using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { Byte[] assemblyData = new Byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } }; Application.Run(new Form1()); } }
这里要注意的是(WindowsFormsApplication1.)这个是需要改动的点,就是dll在exe资源中的前缀名称,大家可以使用反编译工具查看exe资源,然后再修改。
5.测试
找到bin目录下,把exe文件拷贝到桌面或者其他地方(没有依赖的dll,这里是没有ClassLibrary1.dll的地方),运行。
大功告成!
注意事项:
1.AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>。。。。 这个核心方法必须要放到Form启动之前,因为一旦启动以后,就不会执行这个了,进程被阻 塞。 2.在WPF中没有Programe类,大家可以重写App.xaml.cs中的App类的OnStartup方法:protected override void OnStartup(StartupEventArgs e)。然后在这个方法最前面添加AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>。。。。 这个核心方法。
下面提供的是Winform和WPF的示例源码:源码下载
相关文章推荐
- 函数malloc()和calloc()的区别
- 单链表面试经典问题
- C++primer第9章习题解答
- 把数据输出到Word (非插件形式)
- 小孩胆怯黏人爱哭鼻子闹均是病[图]
- firebug中的console.log()使用注意的问题
- shuffle1
- 时间复杂度
- one more time one more chance
- Matlab绘图
- matlab 如何使用代理服务器 使用urlread函数
- 感受一下JS
- 苹果收购Beats背后:库克已走出乔布斯“阴影”
- C++的类型萃取技术
- *.bz2和*.gz分别是什么压缩格式
- 【LeetCode】Combinations
- Web App 讲义教程
- lamp
- nexus 4刷机出现wifi、声音无法使用情况
- CGAffineTransformMakeRotation改变了center