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中(转)的更多相关文章

  1. vs 如何将dll打包到exe中

    方法如下:首先需要安装NuGet 然后安装Fody.Costura 重新启动vs 编译项目即可 虽然根目录下还生成了dll但是你的程序已经可以脱离dll运行了,其实是将你的dll打入了exe中你可以看 ...

  2. C# 把引用的dll嵌入到exe文件中

    当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe 当然有多种方法可以打包, 比如微软的ILMerge,混淆器附带的打包... 用代码打包的实现方式也有很好,本文只是其中 ...

  3. .NET 合并程序集(将 dll 合并到 exe 中)

    ------------恢复内容开始------------ ------------恢复内容开始------------ 背景:我们的应用程序通常都是由多个程序集组成,例如一个 exe 程序依赖于多 ...

  4. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  5. C#winform将dll封装到exe当中

    我们在在winform程序时经常会用到外部dll,正常情况下,我的exe运行文件旁就需要这些dll文件相伴,总感觉不爽~~特别是要把软件给别人的时候,如果DLL比较多或者没有放在同一个地方,那麻烦大了 ...

  6. WinForm开发框架--动态读取DLL模式

    1\ WinForm开发框架--动态读取DLL模式   http://www.2cto.com/kf/201306/217199.html 2\ 广州爱奇迪     http://www.iqidi. ...

  7. ocx文件转换成C#程序引用的DLL

    将ocx文件转换成C#程序引用的DLL文件的办法  将ocx文件转换成C#程序引用的DLL文件的办法,需要的朋友可以参考一下  1.打开VS2008或VS2010命令提示符(此例用VS2008) 将o ...

  8. C# 动态修改dll的签名 以及修改引用该dll文件的签名

    在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...

  9. 未能找到元数据文件“引用的DLL的路径”

    使用VS的时候   偶尔会出现错误 [未能找到元数据文件“引用的DLL的路径”] 但是实际上项目中这些DLL都是做了引用的,甚至你前一天打开还是好好的,睡一觉起来 不知道什么原因 就酱紫了 原因:不详 ...

随机推荐

  1. Codeforces Gym101522 A. Ambiguous Dates (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)

    A. Ambiguous Dates There are two popular formats for representing a date: day/month/year or month/da ...

  2. Fennec VS. Snuke --AtCoder

    题目描述 Fennec and Snuke are playing a board game.On the board, there are N cells numbered 1 through N, ...

  3. luogu P1304 哥德巴赫猜想

    题目描述 输入N(N<=10000),验证4~N所有偶数是否符合哥德巴赫猜想. (N为偶数). 如果一个数,例如10,则输出第一个加数相比其他解法最小的方案.如10=3+7=5+5,则10=5+ ...

  4. org.apache.commons.io.Charsets

    requiredCharsets:由Java平台支持字符集对象标准名称,构造一个sorted map. public void test() { Map<String, Charset> ...

  5. IOS开发~开机启动&无限后台运行&监听进程

    非越狱情况下实现: 开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动: 无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill: 监听 ...

  6. Oracle 检查表空间使用情况

    --检查表空间使用情况  SELECT f.tablespace_name       , a.total "total (M)"       , f.free "fre ...

  7. 200多种Android动画效果的强悍框架

    admin 发布于2015-10-23 14:33 363/68015 [精品推荐]200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^ 功能模块和技术方案 只 ...

  8. 蒙特卡洛法MATLAB

    %%unifrnd函数的使用 %unifrnd函数可以创建随机的连续均匀分布的数组,一般式为R=unifrnd(A,B); %A和B是标量或者相同维数的行向量或者列向量.R=unifrnd(A,B,[ ...

  9. C语言对文件的读写操作以及处理CSV文件的方法

    #include <stdio.h> #define F_PATH "d:\myfile\file.txt" int main(void) { FILE *fp = N ...

  10. python+tesseract验证码识别的一点小心得

    由于公司需要,最近开始学习验证码的识别 我选用的是tesseract-ocr进行识别,据说以前是惠普公司开发的排名前三的,现在开源了.到目前为止已经出到3.0.2了 当然了,前期我们还是需要对验证码进 ...