c#项目将dll打包到exe中的步骤

意图:

想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode.SharpZipLib.dll)一同编译进exe中,并编译后仅一个exe程序就可以独立运行不再需要其它文件。

实现:

1、将两个dll库文件作为资源文件添加进项目中;

2、添加功能代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.IO;

namespace AutoUpdateServer.Core
{
  /// <summary> 载入资源中的动态链接库(dll)文件
  /// </summary>
  static class LoadResourceDll
  {
    static Dictionary<string, Assembly> Dlls = new Dictionary<string, Assembly>();
    static Dictionary<string, object> Assemblies = new Dictionary<string, object>();

    static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
      //程序集
      Assembly ass;
      //获取加载失败的程序集的全名
      var assName = new AssemblyName(args.Name).FullName;
      //判断Dlls集合中是否有已加载的同名程序集
      if (Dlls.TryGetValue(assName, out ass) && ass != null)
      {
        Dlls[assName] = null;//如果有则置空并返回
        return ass;
      }
      else
      {
        throw new DllNotFoundException(assName);//否则抛出加载失败的异常
      }
    }

    /// <summary> 注册资源中的dll
    /// </summary>
    public static void RegistDLL()
    {
      //获取调用者的程序集
      var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
      //判断程序集是否已经处理
      if (Assemblies.ContainsKey(ass.FullName))
      {
        return;
      }
      //程序集加入已处理集合
      Assemblies.Add(ass.FullName, null);
      //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的)
      AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
      //获取所有资源文件文件名
      var res = ass.GetManifestResourceNames();
      foreach (var r in res)
      {
        //如果是dll,则加载
        if (r.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
        {
          try
          {
            if (r.Contains("CryptEnDe.dll")
              || r.Contains("CryptEnDe_d.dll"))
            {
              ExtractResourceToFile(r, PathUtils.GetUpdateDllPath() + @"/" + r.Substring(r.IndexOf('.') + 1));
            }

            var s = ass.GetManifestResourceStream(r);
            var bts = new byte[s.Length];
            s.Read(bts, 0, (int)s.Length);
            var da = Assembly.Load(bts);
            //判断是否已经加载
            if (Dlls.ContainsKey(da.FullName))
            {
              continue;
            }
            Dlls[da.FullName] = da;
          }
          catch(Exception e)
          {
            //加载失败就算了...
          }
        }
      }
    }

    private static void ExtractResourceToFile(string resourceName, string filename)
    {
      //if (!System.IO.File.Exists(filename))
      {
        using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        {
          using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
          {
            byte[] b = new byte[s.Length];
            s.Read(b, 0, b.Length);
            fs.Write(b, 0, b.Length);
          }
        }
      }
    }

  }
}

其中PathUtils.GetUpdateDllPath()函数为获取dll释放的路径,根据自己需要指定路径

public static string GetUpdateDllPath()
{
  string strPath = @"C:/LTShiyi/cache/updatedll";
  if (!Directory.Exists(strPath))
  {
    Directory.CreateDirectory(strPath);
  }

   return strPath;
}

3、在程序入口Program类中调用上面的接口函数

static Program()
{
  AutoUpdateServer.Core.LoadResourceDll.RegistDLL();
}

4、编译即可。

以上就是c#项目将dll打包到exe中的步骤的详细内容,更多关于c# dll打包到exe的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#执行EXE文件与输出消息的提取操作

    简介 有时候会需要在c#特别是WPF环境下调用其他的程序,这类型的程序以命令行为执行环境,这里就说明下如何调用exe并传递参数 一般有两种方法 一种是直接调用exe程序并执行,另一种是调用cmd.exe然后通过输入的方式来执行指定的程序,前者虽然直接但是有时候不能读出输出的信息 因此这里我推荐使用第二个方法,使用异步的方式来创建cmd.exe进程,然后调用我们所需要的程序 1.声明和初始化一个Process类实例 //进程的名称 string fileName = "cmd.exe";

  • c# 从内存中释放Selenium chromedriver.exe

    背景 我设置了一个c#代码来运行Selenium chromedriver.exe.在运行结束时,我有browser.close()来关闭实例.(browser = webdriver.Chrome())我相信它应该从内存中释放chromedriver.exe(我在Windows 7上).但是每次运行后,内存中仍有一个chromedriver.exe实例. 问题窥探 从理论上讲,调用browser.Quit将关闭所有浏览器选项卡并终止进程. 但是,在我的情况下,我无法做到这一点 - 因为我并行运

  • 浅析C# 索引器(Indexer)

    索引器(Indexer) 允许一个对象可以像数组一样被索引.当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样.您可以使用数组访问运算符([ ])来访问该类的实例. 语法 一维索引器的语法如下: element-type this[int index] { // get 访问器 get { // 返回 index 指定的值 } // set 访问器 set { // 设置 index 指定的值 } } 索引器(Indexer)的用途 索引器的行为的声明在

  • C#调用python.exe使用arcpy方式

    背景 环境:ArcGis10.2.2.C#开发程序一直以来以调用Desktop的python环境(32位)来做数据处理分析.但是数据量大时,出现了内存资源不够的情况.因此决定换成使用64位python环境. 遇到问题 C#通过Process.Start()去调用64位python.exe,在Debug模式下毫无问题,但是直接运行exe就报错Process finished with exit code -1073741819 (0xC0000005).指向异常. 分析问题 后来发现是由于arcp

  • c# 使用handle.exe解决程序更新文件被占用的问题

    我公司最近升级程序经常报出更新失败问题,究其原因,原来是更新时,他们可能又打开了正在被更新的文件,导致更新文件时,文件被其它进程占用,无法正常更新而报错,为了解决这个问题,我花了一周时间查询多方资料及研究,终于找到了一个查询进程的利器:handle.exe,下载地址:https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx,我是通过它来找到被占用的进程,然后KILL掉占用进程,最后再来更新,这样就完美的解决了更新时文件被占用报错

  • C# 调用exe传参,并获取打印值的实例

    调用方法: string baseName = System.IO.Directory.GetCurrentDirectory(); // baseName+"/" // string fileName = @"C:\Users\59930\Desktop\20170605\WindowsFormsApp1\WindowsFormsApp1\WindowsFormsApp1\bin\x86\Debug\WindowsFormsApp1.exe"; string fi

  • c# 将Minio.exe注册成windows服务

    minio 注册成windows 服务的工具开发 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Management.Automation; using Sys

  • c#项目将dll打包到exe中的步骤

    意图: 想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode.SharpZipLib.dll)一同编译进exe中,并编译后仅一个exe程序就可以独立运行不再需要其它文件. 实现: 1.将两个dll库文件作为资源文件添加进项目中: 2.添加功能代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System

  • 将java普通项目打包成exe可执行文件的步骤记录

    前言 · 提示,无论打包成jar还是exe程序,运行都需要JDK,需要给没有安装JDK的电脑安装:不会安装JDK的朋友可以参考这篇文章:https://www.jb51.net/article/179937.htm · maven项目有自己的打jar包方式,我们普通的java项目,可以安照步骤一打包成jar: 步骤一.先把项目打包成jar包 1. 打开项目结构 2. 选择jar包形式 3. 设置主类 4. 构建 5. 确认构建 6. 打包完成,在项目的out目录下有jar了. 步骤二.把jar包

  • C#将dll打包到程序中的具体实现

    直接进入主题 先来看一个栗子,假设现在有一个第三方dll 复制代码 代码如下: namespace TestLibrary1{    public class Test    {        public void Point()        {            Console.WriteLine("aaabbbccc");        }    }} TestLibrary1.dll 在项目中引用,然后调用其中的方法Test,将输出aaabbbccc 复制代码 代码如下:

  • pyinstaller打包程序exe踩过的坑

    基础环境 python 2.7.17 pyinstaller 3.5 安装pyinstaller pip install pyinstaller 坑,大坑,深坑 背景:用pygame写了个贪吃蛇游戏,要打包成exe 用到了字体文件 C:\Windows\Fonts\simsun.ttc (宋体) 打包过程中没有报错 打包过程中的警告可以忽略,这个警告: WARNING: Hidden import "pygame._view" not found! 运行exe的时候报NotImplem

  • 使用electron将vue-cli项目打包成exe的方法

    如果你已经做好了一个vue的项目,并且想要将他打包成exe,那么请继续阅读. 首先你可以下载一个demo了解一下. git clone https://github.com/electron/electron-quick-start cd electron-quick-start npm install npm start 这个demo主要就是main.js和package.json 打开main.js const {app, BrowserWindow} = require('electron

  • VS2019项目打包生成.exe文件与Setup的步骤实现

    对于Visual Studio Installer ,我们通常称为:setup项目,是一个用于自定义安装部署的项目方案.但是在VS2019中不见了,微软是有意废除安装项目的,合作了一个第三方的安装项目单独使用. 我们可以从官网上把Visual Studio Installer 项目扩展下载下来. 地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017In

  • 将python项目打包成exe与安装包的全过程

    目录 一.打包Flask项目 1.1自己写个Flask 2.2 下载pyinstaller 2.3 进入到项目路径下,执行 2.4 运行exe,测试 二.使用nsis把文件夹打包成windows的安装包 2.1 下载安装nsis 2.2把dist文件夹下的run文件夹压缩成zip 2.3使用nsis把压缩包,做成windows安装文件 总结 一.打包Flask项目 1.1自己写个Flask 2.2 下载pyinstaller pip install pyinstaller 可选参数 示例 说明

  • Python项目打包成exe文件

    目录 前言 环境依赖 项目打包 总结 前言 之前有人私信我,他写了一个在终端交互的小程序,希望可以不在IDE的终端显示,而是独立一个窗口进行交互.其实只要把项目打包成exe执行文件,就可以在执行的时候在cmd独立一个窗口了. 如果python项目打包exe呢?下面按照步骤讲解一下. 环境依赖 安装pyinstaller. pip install pyinstaller -i https://pypi.douban.com/simple 项目打包 项目部分代码 先看一下项目在终端执行的效果. 使用

  • C#(.Net)将非托管dll嵌入exe中的实现

    目录 托管dll与非托管dll 下载与安装 添加Dll 调用 编译 托管dll与非托管dll 托管dll实际上是指C#编写的dll,可以直接右键"引用"导入 而大部分情况下,我们需要引用C++写的dll,如果你的dll是使用 DllImport来导入的,那么它就属于非托管dll,这种dll无法直接嵌入exe中,需要借助工具:Costura.Fody,该工具可以使用VS直接下载 下载与安装 右键引用,选择"管理NuGet程序包",搜索 "fody"

  • 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)

    上一篇我们写了怎么将xmind转换成想要的excel格式,这篇再讲一下用Python自带的tkinter库设计一个简单的gui界面,让我们的xmind路径,用例版本执行等都通过这个gui界面来输入,生成我们需要的excel文件. Python要生成gui,库还是比较多的比如wxpython,这个我看了下,感觉比较难懂,毕竟只是设计一个比较简单的gui界面,所以就使用了tkinter库,感觉这个还是比较方便易懂的,大家可以在这里学习tkinter库http://c.biancheng.net/py

随机推荐