dll打包进需要发布的exe z
http://www.cnblogs.com/Jarvin/p/3721195.html
我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布 的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出,我在实践的过程中遇到的几点问题,现在记录下总体的流程和该注意的事项。
一.新建需要使用的类库:
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, , 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的示例源码:源码下载
dll打包进需要发布的exe z的更多相关文章
- 如何将松散的dll打包进需要发布的exe
我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出 ...
- 将Winform程序及dll打包成可执行的exe
使用场景 通常开发的Winform程序,引用了其他类库后,在输出目录下都会产生很多DLL文件,exe执行时必须依赖这些DLL.想要Winform程序只有一个可执行exe文件,又不想打包成安装包,就可以 ...
- Winform程序及dll打包成一个可执行的exe
使用场景 通常开发的Winform程序,引用了其他类库后,在输出目录下都会产生很多DLL文件,exe执行时必须依赖这些DLL.想要Winform程序只有一个可执行exe文件,又不想打包成安装包,就可以 ...
- 控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)
原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版) 很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个e ...
- 将Qt 动态链接生成的exe及依赖dll打包方法
源地址:http://blog.csdn.net/ztz0223/article/details/8939341 将Qt 动态链接生成的exe及依赖dll打包方法 原文:http://www.qtcn ...
- 将dll放进exe[.Net]
原文:将dll放进exe[.Net] 两种方案: 1.使用ILMerge工具. 缺点:需离开工程,使用第三方工具(ILMerge). 2.将dll作为Resource放进exe,exe执行时动态加载( ...
- C#中将dll汇入exe z
用了3层架构,运行目录下有很多dll文件,最终发布时,我打算将dll文件都合并到exe文件中去.微软发布的免费软件ILmerge可以完成这项工作,研究了一下,其用法如下: 1.合并file1.dll. ...
- C# 将dll打包到程序中
本文告诉大家如何把 dll 打包到程序中.很多时候的 软件 在运行的时候需要包括很多 dll 或其他的文件,这样的软件在给其他小伙伴,就需要做一个压缩包,或者用安装软件.这样感觉不太好,所以本文告诉大 ...
- 在.NET Core 3.0中发布单个Exe文件(PublishSingleFile)
原文:在.NET Core 3.0中发布单个Exe文件(PublishSingleFile) 假设我有一个简单的" Hello World"控制台应用程序,我想发送给朋友来运行.朋 ...
随机推荐
- Js 处理将时间转换 “年-月-日”
将时间 \/Date(1432828800000+0800)\/" 转换成:“年-月-日” //时间转换function ChangeDateFormat(val) { if (v ...
- SPOJ 4487 Splay 基本操作
插入操作,删除操作和置换操作都是单点的,所以不需要lazy标记.这个很简单,都是两次RotateTo,一次Splay操作就搞定. 求最大连续字段和的操作和线段树的题目类似,只需要保存最左边的连续最大字 ...
- maven3.1安装及配置
1.首先下载maven3,并安装 2.环境变量配置与JAVA_HOME的配置一样 3.打开MyEclipse preferences>>Maven4MyEclipse>>Mav ...
- ios登陆界面
代码较老,仅供参考 主要涉及的功能点有: 1.密码输入框要隐藏输入字符,以黑点代替,有时候会在边上设置一个按钮,让用户选择是否需要密文输入 2.Login时会检查输入框,若输入不合法,弹窗提示用户 3 ...
- JAVA多线程synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...
- mysql 跨库JOIN
现有两台MYSQL数据库 一台是192.168.1.1 端口3306 上有数据库DB1 有表TABLE1一台是192.168.1.2 端口3307 上有数据库DB2 有表TABLE2192.168.1 ...
- 为什么样本方差(sample variance)的分母是 n-1?
为什么样本方差(sample variance)的分母是 n-1? (補充一句哦,題主問的方差 estimator 通常用 moments 方法估計.如果用的是 ML 方法,請不要多想不是你們想的那樣 ...
- spoj 237
好牛的题 哈哈 #include <cstdio> #include <algorithm> #define S(n) scanf("%d",&n ...
- Android Activity交互及App交互
Android交互--------->Intent Activity之间----->Explicit Intent App之间--------->Implicit Intent
- Unity3D接入移动MM支付SDK(强联网)的问题
原地址:http://blog.csdn.net/lihandsome/article/details/11919113 因为移动MM支付的SDK只提供android版本的,要自己写过一个androi ...