架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 43909|回复: 7

[资料] C#将dll打包到exe的程序中

[复制链接]
发表于 2016-5-26 15:27:14 | 显示全部楼层 |阅读模式
网上看了许多工具,可以把dll打包到exe程序里面,但是,如果,把dll打包到exe程序中,

有的打包软件,会有问题,如果,再加壳的话,估计,问题更大了,

我想有什么方法,可以把dll一起打包到exe中呢????突然,我想到嵌入式资源。

如图,我把dll都改成了嵌入的资源了:

QQ截图20160526152346.jpg

这样就可以了吗??no,当然不可以。

  1. /// <summary> 载入资源中的动态链接库(dll)文件
  2.     /// </summary>
  3.     static class LoadResourceDll
  4.     {
  5.         static Dictionary<string, Assembly> Dlls = new Dictionary<string, Assembly>();
  6.         static Dictionary<string, object> Assemblies = new Dictionary<string, object>();
  7.         static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
  8.         {
  9.             //程序集
  10.             Assembly ass;
  11.             //获取加载失败的程序集的全名
  12.             var assName = new AssemblyName(args.Name).FullName;
  13.             //判断Dlls集合中是否有已加载的同名程序集
  14.             if (Dlls.TryGetValue(assName, out ass) && ass != null)
  15.             {
  16.                 Dlls[assName] = null;//如果有则置空并返回
  17.                 return ass;
  18.             }
  19.             else
  20.             {
  21.                 throw new DllNotFoundException(assName);//否则抛出加载失败的异常
  22.             }
  23.         }
  24.         /// <summary> 注册资源中的dll
  25.         /// </summary>
  26.         public static void RegistDLL()
  27.         {
  28.             //获取调用者的程序集
  29.             var ass = new StackTrace(0).GetFrame(1).GetMethod().Module.Assembly;
  30.             //判断程序集是否已经处理
  31.             if (Assemblies.ContainsKey(ass.FullName))
  32.             {
  33.                 return;
  34.             }
  35.             //程序集加入已处理集合
  36.             Assemblies.Add(ass.FullName, null);
  37.             //绑定程序集加载失败事件(这里我测试了,就算重复绑也是没关系的)
  38.             AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
  39.             //获取所有资源文件文件名
  40.             var res = ass.GetManifestResourceNames();
  41.             foreach (var r in res)
  42.             {
  43.                 //如果是dll,则加载
  44.                 if (r.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
  45.                 {
  46.                     try
  47.                     {
  48.                         var s = ass.GetManifestResourceStream(r);
  49.                         var bts = new byte[s.Length];
  50.                         s.Read(bts, 0, (int)s.Length);
  51.                         var da = Assembly.Load(bts);
  52.                         //判断是否已经加载
  53.                         if (Dlls.ContainsKey(da.FullName))
  54.                         {
  55.                             continue;
  56.                         }
  57.                         Dlls[da.FullName] = da;
  58.                     }
  59.                     catch
  60.                     {
  61.                         //加载失败就算了...
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     }
复制代码


把这个类复制到项目中,然后,在main方法注册dll,我是winform程序,

代码如下:

/// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            LoadResourceDll.RegistDLL();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Login());
        }


最后,搞定了!!!生成了一个exe文件。

QQ截图20160526152658.jpg




上一篇:c#通过调用Win32 API函数清楚浏览器缓存和cookie
下一篇:asp.net管理员或者用户登录超过5次,关闭浏览器登录
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-8-8 06:10:34 | 显示全部楼层
楼主好有想法
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-8-12 06:46:52 | 显示全部楼层
赞一赞哦
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-5 13:56:32 | 显示全部楼层
厉害了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-4-17 17:39:32 | 显示全部楼层
楼主 还是我  我想问一下 我把视频放入嵌入式资源 读出来的是字节数组  有啥办法放到播放器直接播放  (不想写到本地在读取路径播放,视频比较大会卡)
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-7-8 19:29:05 | 显示全部楼层
厉害了,赞一赞哦
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-8-19 08:53:50 | 显示全部楼层
楼主好有想法
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2023-2-28 11:53:43 | 显示全部楼层
看看,感谢分享
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-5-28 09:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表