当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe

当然有多种方法可以打包, 比如微软的ILMerge,混淆器附带的打包...

用代码打包的实现方式也有很好,本文只是其中一种实现方式,不需要释放文件!

方法如下:

1.项目下新建文件夹Resources

2.把要打包的dll文件放在Resources文件夹下,并包括在项目中

3.右键文件属性, 生成操作选择嵌入的资源

4.实现如下代码, 在窗口构造中实现也可以(在窗体事件中无效,如winform_load)

using System;
using System.Reflection;
using System.IO; static class Program
{
static void Main()
{
//添加程序集解析事件
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
//... 启动应用窗体
}
//当程序集加载失败时调用此事件
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return LoadFromResource("ICSharpCode.SharpZipLib.dll");
}
//加载资源转为Assembly程序集
private static Assembly LoadFromResource(string resName)
{
Assembly ass = Assembly.GetExecutingAssembly();
using (Stream stream = ass.GetManifestResourceStream("AutoPublish.Resources." + resName))
{
byte[] bt = new byte[stream.Length];
stream.Read(bt, , bt.Length);
Assembly asm = Assembly.Load(bt);//转换流到程序集
return asm;
}
return null;
}
}

实现原理:

把dll嵌入到exe程序的资源中,

并实现程序集加载失败事件(当在程序目录和系统目录下找不到程序集触发),

当找不到程序集时就从资源文件加载, 先转换为字节数组再转换到程序集返回给程序,

这样dll就被加载到程序中了.

如果exe所在文件夹下有相应dll, 事件并不会被触发!

C# 把引用的dll嵌入到exe文件中的更多相关文章

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

    Winform程序经常需要引用一些第三方dll文件,这些dll在发布后与exe文件保存在同一目录下,虽然将dll文件集成到exe中会增大文件尺寸,但程序目录会相对整洁. 下面介绍一种比较简单的集成方法 ...

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

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

  3. [C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中

    引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...

  4. 将 mp3 等音乐资源以资源形式嵌入 exe 文件中

    引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌 ...

  5. WPF:将Office文档、任意类型文件嵌入到EXE可执行文件中

    原文:WPF:将Office文档.任意类型文件嵌入到EXE可执行文件中 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei198 ...

  6. 在delphi的exe文件中嵌入另外一个exe文件

    http://www.cnblogs.com/dabiao/archive/2009/11/28/delphi.html 1.创建rc文件.可以用任意文本编辑器来写.文件格式为:"资源名 资 ...

  7. 在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0

    //在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0//如果某字符串, 直接传入字符串进来//如果要查找16进制,则用如下格式传参进来: #$1A#$2A#$3A function F ...

  8. C#将Dll嵌入到EXE

    感谢博主的方法: https://blog.csdn.net/lin381825673/article/details/39122257 我之前也看了网上的其他的方法试了都不行 第一种方法就是说用IL ...

  9. C#将DLL嵌入到exe当中

    1.选中项目文件,找到Resources.resx,双击Resources.resx,然后添加文件(选择需要的dll文件),点击确定,项目下会自动生成一个Resources文件夹,里面包含添加dll. ...

随机推荐

  1. Boost C++: 数据结构---tuple

    #include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple_io.hpp> #include <boost/ ...

  2. C#基础-可访问性-public、ptotected、protected internal、internal、private

    1.类型的可访问性 a.关键字有public.internal,其中public表示该类型对于程序集都可见.internal表示该类型仅对当前程序集可见.此处的类型可以为类.接口.结构等. b.如果不 ...

  3. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  4. jquery 分页控件功能

      <script>        //分页         function getPageNum(num) {             $("#PageNum ul" ...

  5. CentOS编译安装lamp

    LAMP环境搭建(编译安装CentOS+httpd2.2+mysql5.5+php5.4) 首先准备以下压缩包 <ignore_js_op> (1)编译安装apache 1.配置防火墙,开 ...

  6. C#操作xml

    最进在做一个项目,需要用到xml做配置文件,但是自己忘的差不多了,所以就温习了一遍.以下是我项目中所用到的,所以肯定也不全面. 1.新建xml文件 using System.Xml;//需要引用 st ...

  7. Oracle登录时提示错误,导致用户无法登录

    Oracle登录时提示错误,导致用户无法登录,错误如下 ------------------------------------------------------------------------ ...

  8. 6)Java中String类

    1)String对象的初始化   由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:     String s = “abc”;     ...

  9. c++ 类与函数中static变量初始化问题(转)

    首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...

  10. 实战Django:官方实例Part1

    [写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心 ...