使用嵌入资源实现单个EXE文件发布.net应用程序

作者:V君 发布于:2014-12-14 0:16 Sunday 分类:折腾手记

点击查看原图

 

起因是啥早已忘记, 应该是觉得扯着一堆DLL不爽吧, 就酱折腾起来了, 最后, 我成功了 乂目!


尝试并失败过的方法:

■内存中加载程序集 -- 失败在非托管或混合程序集

■解压到临时文件, 新建应用程序域指定 BaseDirectory 加载 --  失败在 GCHandle


成功的方法:

将嵌入的引用程序集解压到临时目录, 将临时目录添加到环境变量PATH前(重要)

使用 AppDomain.CurrentDomain.AssemblyResolve 事件

在里头用 Assembly.LoadFrom 把需要的程序集加载起来 (只有这能用 Load/LoadFile 都不行) 


具体实现步骤:

把你引用的dll全部添加到项目里头

使用引用起来(废话) 但是你要取消引用项的`复制本地`  这样bin底下已经不会出现多余DLL了!

这时候跑起来肯定会爆 FileNotFound 啦! 

别急, 有请 AppDomain.CurrentDomain.AssemblyResolve 事件

点击查看原图

按需把解压到临时目录的程序集加载起来~

DllImport的非托管DLL呢? 因为设置了环境变量PATH, 就算是DllImport也能顺利加载~


这时候编译出来的EXE有35MB, 略为不爽, 使用了压缩大杀器7z# 之后效果非常不错呢


于是折腾成这样:

使用gz压缩SevenZipSharp的程序集, 嵌入资源

使用LZMA压缩7z.dll并嵌入资源 -- 因为7z#有托管代码的LZMA, 但是没包括7z文件解压

将除上述外的依赖程序集打包成7z并嵌入资源


就成了酱得到一个10来M的EXE~

点击查看原图


等哪天能把这些行为自动化 就发布一个库吧 就叫做 Aio1ef

有样学样递归简称 Aio1ef In Only 1 Exe File 乂目~


EOF~ 清除本月0博文~

标签: 软件开发 C# DLL嵌入资源 程序打包

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap