.NET Winform 将引用的dll文件集成到exe中(转)
Winform程序经常需要引用一些第三方dll文件,这些dll在发布后与exe文件保存在同一目录下,虽然将dll文件集成到exe中会增大文件尺寸,但程序目录会相对整洁。
下面介绍一种比较简单的集成方法和注意事项。
第一步,将需要引用的dll文件复制到项目中
您可以:1.复制到项目根目录;2.复制到某个文件夹中。
此处以将dll复制到"lib"文件夹为例。

将要引用的dll文件复制到"lib"文件夹中
第二步,引用复制到项目中的dll文件
右键点击"引用"或项目名称,选择"添加引用(F)..."

切换至在“添加引用”对话框中的“浏览”选项卡,选择项目目录中刚刚复制过来的dll文件。

第三步,设置引用项的属性为“复制到输出目录”为“不复制”
右键点击“引用”文件夹中刚刚完成添加引用的项目,并点击“属性”

将“属性页”中的“复制本地”项改为“False”。

第四步,设置之前复制到项目中的dll文件属性
右键点击最开始复制到项目目录中的dll文件,点击“属性”。

将“属性”页中的“复制到输出目录”设置为“不复制”,“生成操作”设置为“嵌入的资源”。

至此,所有的文件和引用设置就结束了,下面是最后的关键一步:
第五步,在program.cs中添加加载文件代码
由于文件被集成到exe中,不会被自动加载,所以需要在这里告诉程序在加载失败时加载集成在exe中的dll文件。
在Program.cs中添加下面高亮部分代码,目的是在程序集解析失败时(由于我们设置不将dll复制到根目录,所以此处的解析失败自然就是找不到引用的dll文件),告诉程序加载已经集成到exe中的dll。
这里要注意设置dll文件前缀(下面示例代码中的[resourceName]变量):集成到项目中的文件,在原始文件名之前会自动加入【程序集名称】和【文件夹名】,见下方用Reflector工具打开的exe文件中的资源文件,像这样:“[程序集名称].[文件夹名].[原始文件名]”。
如果dll文件是复制到根目录,那么集成后的文件名就是:“[程序集名称].[原始文件名]”。
如果dll文件是复制到dll目录,那么集成后的文件名就是:“[程序集名称].dll.[原始文件名]”。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using System.Reflection;namespace ProxySniffer{ static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //用于加载引用的dll资源 AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { String resourceName = "ProxySniffer.lib." + 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.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }} |
使用Reflector打开exe文件查看内部资源就一目了然了,这个各位可以自己确认总结规律:

程序集名称,还可以使用以下方式获取:
|
1
|
Assembly.GetExecutingAssembly().GetName().Name |
最后,重新发布程序,exe变大,同目录下的dll文件也消失了。
.NET Winform 将引用的dll文件集成到exe中(转)的更多相关文章
- vs 如何将dll打包到exe中
方法如下:首先需要安装NuGet 然后安装Fody.Costura 重新启动vs 编译项目即可 虽然根目录下还生成了dll但是你的程序已经可以脱离dll运行了,其实是将你的dll打入了exe中你可以看 ...
- C# 把引用的dll嵌入到exe文件中
当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe 当然有多种方法可以打包, 比如微软的ILMerge,混淆器附带的打包... 用代码打包的实现方式也有很好,本文只是其中 ...
- .NET 合并程序集(将 dll 合并到 exe 中)
------------恢复内容开始------------ ------------恢复内容开始------------ 背景:我们的应用程序通常都是由多个程序集组成,例如一个 exe 程序依赖于多 ...
- WPF程序将DLL嵌入到EXE的两种方法
WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...
- C#winform将dll封装到exe当中
我们在在winform程序时经常会用到外部dll,正常情况下,我的exe运行文件旁就需要这些dll文件相伴,总感觉不爽~~特别是要把软件给别人的时候,如果DLL比较多或者没有放在同一个地方,那麻烦大了 ...
- WinForm开发框架--动态读取DLL模式
1\ WinForm开发框架--动态读取DLL模式 http://www.2cto.com/kf/201306/217199.html 2\ 广州爱奇迪 http://www.iqidi. ...
- ocx文件转换成C#程序引用的DLL
将ocx文件转换成C#程序引用的DLL文件的办法 将ocx文件转换成C#程序引用的DLL文件的办法,需要的朋友可以参考一下 1.打开VS2008或VS2010命令提示符(此例用VS2008) 将o ...
- C# 动态修改dll的签名 以及修改引用该dll文件的签名
在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...
- 未能找到元数据文件“引用的DLL的路径”
使用VS的时候 偶尔会出现错误 [未能找到元数据文件“引用的DLL的路径”] 但是实际上项目中这些DLL都是做了引用的,甚至你前一天打开还是好好的,睡一觉起来 不知道什么原因 就酱紫了 原因:不详 ...
随机推荐
- 牛客网 牛客小白月赛1 F.三视图
F.三视图 链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网 这个题自己想一下三维的,正视图和左视图中y轴为行数,x轴和z轴是列数,因为 ...
- Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)
题目链接 2016 EC-Final 题意 现在要找到数列中连续两个子序列(没有公共部分).要求这两个子序列本身内部没有重复出现的数. 求这两个子序列的长度的和的最大值. 首先预处理一下.令$ ...
- Codeforces 371E Subway Innovation (前缀和预处理应用)
题目链接 Subway Innovation 首先不难想到所求的k个点一定是连续的,那么假设先选最前面的k个点,然后在O(1)内判断第2个点到第k+1个点这k个点哪个更优. 判断的时候用detla[i ...
- 专利事务所信息Python爬取
数据来源:http://www.acpaa.cn/ 目前事务所的信息没有做反爬限制,还是很容易拿到数据的 没有用html解析工具,直接上正则,结果就是需要处理很多乱七八糟的空格...为了能将日期顺利的 ...
- GCJ——Crazy Rows (2009 Round 2 A)
题意: 给定一个N*N的矩阵,由0,1组成,只允许交换相邻的两行,把矩阵转化为下三角矩阵(对角线上方全是0),最少需要多少次交换?(保证可以转化为下三角矩阵) Large: N<=40 解析: ...
- apache url rewrite问题
apache RewriteEngine Your browser sent a request that this server could not understand http://www.ra ...
- Windows 10系统出现:“出现系统还原使用的卷影复制服务无法运行...”的问题解决
在服务中是:Volume Shadow Copy和Microsoft Software Shadow Copy Provider这两项.把它开启.
- CSS3的box-shadow
基础说明: 外阴影:box-shadow: X轴 Y轴 Rpx color; 属性说明(顺序依次对应): 阴影的X轴(可以使用负值) 阴影的Y轴(可以使用负值) 阴影 ...
- Scut游戏服务器引擎6.0.5.0发布-支持C#脚本
1. 增加C#脚本支持2. 增加Pay和Sns中间件对Mysql数据库支持3. 精简布署步骤,取消Redis写入程序,将其移到游戏底层运行4. 修正Mysql对中文可能会出现乱码的BUG 点击下载:S ...
- VS2010 MFC中 单独添加ODBC数据库记录集类(CRecordset)方法
基于VS2010 MFC的项目是之前建好的,后来需要添加数据库. 方法分享于此. 1. 打开自己的项目,项目->添加类. 2. 选MFC ODBC使用者,点右下角的添加. 3. 点数据源. / ...