zoukankan      html  css  js  c++  java
  • C# 把引用的dll嵌入到exe文件中

    当发布的程序有引用其它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, 0, bt.Length);
            Assembly asm = Assembly.Load(bt);//转换流到程序集
            return asm;
            }
            return null;
        }
    } 

    实现原理:

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

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

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

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

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

  • 相关阅读:
    面试常考点:http和https的区别与联系
    常见的反爬虫和应对方法
    2019/1/1 Python今日收获
    2018/12/26,12/27 Python今日收获
    2018/6/7-6/8 Python今日收获
    2018/6/6 Python今日收获
    CSS(3)——visited伪类
    CSS中margin和padding的区别
    CSS(2)——CSS的文字,边框,背景与列表
    CSS(1)——CSS的引入方式与选择器
  • 原文地址:https://www.cnblogs.com/hanf/p/5889016.html
Copyright © 2011-2022 走看看