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, 事件并不会被触发!

  • 相关阅读:
    ListCtr 每一行都加上选择框
    VC中MFC check box的用法
    第二章 掌握C++(2)C++的特性(上)
    第二章 掌握C++(1)从结构到类
    道路横断面设计
    第一章 Windows程序内部运行机制(5)动手编写一个Windows程序
    第一章 Windows程序内部运行机制(4)WinMain函数(续)
    将div旋转任意角度
    地址栏图标修改
    script 错误
  • 原文地址:https://www.cnblogs.com/hanf/p/5889016.html
Copyright © 2011-2022 走看看