我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章将为大家详细讲解有关c#项目将dll打包到exe中的步骤是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。意图:想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode
2023-06-14

C#如何将DLL打包到程序中

这篇文章主要介绍了C#如何将DLL打包到程序中问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

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

这篇文章介绍了C#将dll打包到程序中的具体实现,有需要的朋友可以参考一下
2022-11-15

SpringBoot项目打jar包与war包的详细步骤

SpringBoot和我们之前学习的web应用程序不一样,其本质上是一个Java应用程序,那么又如何部署呢?这篇文章主要给大家介绍了关于SpringBoot项目打jar包与war包的详细步骤,需要的朋友可以参考下
2023-02-24

idea项目代码打包为jar包的超详细步骤

因为业务开发场景需要,将开发项目中的Java类打成一个jar包引入到外部工具中,下面这篇文章主要给大家介绍了关于idea项目代码打包为jar包的相关资料,需要的朋友可以参考下
2023-01-11

vue项目打包部署跨域的实现步骤

在前端Vue项目打包后,如果需要访问另一个域名下的接口,由于浏览器的同源策略限制,会出现跨域问题,本文就介绍一下vue项目打包部署跨域的实现步骤,感兴趣的可以了解一下
2023-05-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录