.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文件也消失了。

时间: 2025-01-11 04:14:00

.NET Winform 将引用的dll文件集成到exe中(转)的相关文章

vs 如何将dll打包到exe中

方法如下:首先需要安装NuGet 然后安装Fody.Costura 重新启动vs 编译项目即可 虽然根目录下还生成了dll但是你的程序已经可以脱离dll运行了,其实是将你的dll打入了exe中你可以看到exe的体积变大. 详细步骤参考:http://www.cnblogs.com/lonelyxmas/p/5568876.html(转自博客园) 安装包下载:https://www.nuget.org/packages/Fody/

分析ntdll.dll和ntoskrnl.exe中的 NT*和ZW*函数区别

OpenProcess-->ntdll!NtOpenProcess-->ntdll!zwOpenProcess-->ntdll!KiFastSystemCall() ↓mov edx, esp ↓sysenter 用户层------------------------------------------------------------------------------------------------------ ↓ 内核层 nt!KiFastCallEntry()      

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

WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了>可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html 引言 前几一写了一个小工具----<Vi

exe中嵌入dll和exe中释放dll

BinRes.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef _waxie_binary_resource_h_ #define _waxie_binary_resource_h_ #include <string> class BinRes  { public:     BinRes();     virtual ~BinRes(); public:     static void ExtractBinResour

c# winform 引用sqlite.dll 运行报错解决方法

错误信息 :  未能加载文件或程序集“System.Data.SQLite, Version=1.0.81.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项.试图加载格式不正确的程序. 原因是 此sqlite.dll 是32位的. 解决方法 ,将项目的 目标平台改为 x86 如图 c# winform 引用sqlite.dll 运行报错解决方法

VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 &lt;转&gt;

昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁闷. 后来经过调查,终于发现了解决方法: 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4. 而我原来的设置是.NET Framework 4 Client Profile.问题就出在这里. 以下是MSDN给出的提示: If you ar

C#中用ILMerge将所有引用的DLL打成一个DLL文件

C#中用ILMerge将所有引用的DLL打成一个DLL文件 有些文件是必须一起使用的,如果能把多个DLL打包成一个DLL文件,那么引用文件的时候就不需要一个个地去引用,而且每次移动文件的时候也不至于少了哪个必须的DLL文件. 多个DLL文件打包成一个DLL文件的方法如下:1.先到下面的网址下载ILMerge安装 http://www.microsoft.com/en-us/download/details.aspx?id=17630 2.安装完之后,执行cmd命令,进入ILMerge目录, 把t

Asp.Net数据控件引用AspNetPager.dll分页

今天与大家分享一下"Asp.Net数据控件引用AspNetPager.dll分页"首先声明以下几点: 1.也许讲解有点初级,希望高手不要"喷"我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13,小生不才: 2.如有什么不对的地方,还希望大家指出,一定虚心学习: 3.本文属于作者原创,尊重他人劳动成果,转载请注明作者,谢谢. 下面开讲: 第一步:首先是下载一个AspNetPager.dll 下载地址 http://files.cnblogs.com/tand

WPF - 如何引用external dll中图片

前几天一直想引用别的DLL里面的一个图片.总是出现各种各样问题,一气之下将图片拷贝到当前Project中,运行良好.虽然知道引用图片,就1.2.列出来的2点就够了. 1. The Build Action should be Resource instead of Embedded Resource. 2. In the WPF application with the following XAML: <Image Source="/ClassLibraryName;Component/i