使用WPF开发的安装包,在创建快捷方式的时候,需要用到COM程序集Windows Script Host Object Model,引用COM程序集后,会在debug目录生成Interop.IWshRuntimeLibrary.dll,但是运行的时候,需要把这个dll放到exe一起,否则会报“未能加载文件或程序集...”的错误。

网上搜索了一番,说是可以通过ILmerge工具解决,具体步骤如下:

步骤一:下载并安装”ILMerge“,下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=17630

步骤二:安装完成以后,将exe文件和dll文件拷贝到ILMerge目录下,打开CMD,进入到ILMerge目录,执行命令

ilmerge /targetplatform:v /ndebug  /target:winexe /out:setup2.exe /log:log.txt  setup.exe Interop.IWshRuntimeLibrary.dll

源程序setup.exe是.net 3.5,但是这个工具的/targetplatform只能选 v1 v2 v4,试了v2 和v4,生成都能生成成功,但是生成的setup2.exe都无法运行,放弃。。。

方法二用到AssemblyResolve事件,该事件在对程序集的解析失败时发生,具体可以看msdn上的解释:https://msdn.microsoft.com/zh-cn/library/system.appdomain.assemblyresolve.aspx

步骤一:将Interop.IWshRuntimeLibrary.dll作为资源添加到exe项目

步骤二:在APP构造函数中注册AssemblyResolve事件,在AssemblyResolve事件中加载该资源,具体代码如下

        public App()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Properties.Resources res = new Properties.Resources();
PropertyInfo dotnetpinfo = res.GetType().GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance).Where(t => t.Name == "Interop_IWshRuntimeLibrary").FirstOrDefault();
byte[] bytes = (byte[])dotnetpinfo.GetValue(res, null);
return System.Reflection.Assembly.Load(bytes);
}

上面的代码还可改进一下,判断args参数,如果是缺少Interop_IWshRuntimeLibrary时才从资源里加载,否则抛出异常

通过AssemblyResolve事件打包合并exe和dll文件的更多相关文章

  1. 使用ILmerge合并Exe、Dll文件的帮助类

    原文:使用ILmerge合并Exe.Dll文件的帮助类 using System; using System.Collections.Generic; using System.Text; using ...

  2. 打包合并多个dll

    复杂项目中会引用大量的第三方dll文件,为了便于管理会尝试把相关打包合并成一个dll文件. 推荐使用ILMerge,如需使用网上自行下载. 使用方法: cd 安装目录 ILmerge /target: ...

  3. 有关windows系统的EXE和DLL文件说法错误

    正确答案: B C   你的答案: C (错误) EXE和DLL文件都是PE文件 EXE不能有导出函数,DLL可以有导出函数 EXE有x86和x64之分,则DLL没有 EXE可以单独运行,DLL则不行 ...

  4. PE头的应用---插入代码到EXE或DLL文件中

    三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...

  5. .net Reactor之exe、dll文件混淆

    .net Reactor之exe.dll文件混淆 .net Reactor的主要功能: 1.是对dll文件.exe文件进行反编译混淆 2.对dll进行内部加锁,限制其使用的固定机器.固定时间.部署次数 ...

  6. C# .exe和.dll文件图标资源提取工具

    Windows 可执行文件(.exe)和动态库文件(.dll)图标资源提取工具 GitHub 功能 图标资源预览 图标资源导出(仅支持导出 PNG 格式) 代码 获取图标资源使用了 Win32 API ...

  7. 将exe和dll文件打包成单一的启动文件

    当我们用 VS 或其它编程工具生成了可执行exe要运行它必须要保证其目录下有一大堆dll库文件,看起来很不爽,用专业的安装程序生成软件又显得繁琐,下面这个方法教你如何快速把exe文件和dll文件打包成 ...

  8. 软件打包为exe NSIS单文件封包工具V2.3

    NSIS单文件封包工具V2.3 这是一款基于NSIS模块的封包制作工具,lzma算法最大压缩率,支持制作单文件,以及NSIS自定义解压封包. 支持注册dll,exe,reg,bat文件 默认提取设置程 ...

  9. 使用Visual studio查看exe或DLL文件的依赖项

    事先准备:只要 Visual Studio 任何版本即可. 点击开始 -> 程序 -> Visual Studio对应的版本,打开Visual Studio Tools -> 选择 ...

随机推荐

  1. javaSE习题 第二章 基本数据类型和数组

    问答: 1.什么叫标识符,标识符的规则是什么? 用来标志类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符. 规则:1.由字母,数字,下划线,美元组成.2.标识符第一个字符不能是数字 ...

  2. wow 滚动动画

    1.demo <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...

  3. Asp.net core 学习笔记 ( HttpClient )

    2018-09-18 core 2.1 之后有新的方案咯 http://www.talkingdotnet.com/3-ways-to-use-httpclientfactory-in-asp-net ...

  4. Superclass和Constructor Chaining

    A subclass inherits accessible date fields and methods from its superclass. Does it inherit construc ...

  5. ubuntu 下Visual Studio Code 安装

    Build in Visual Studio Code Install VSCode The easiest way to install for Debian/Ubuntu based distri ...

  6. 练习:将从表读出来的时间戳除以1000(java读时间戳会多出3个000)用jackson包 实现

    练习:将从表读出来的时间戳除以1000(java读时间戳会多出3个000)jackson包 实现 entity @Entity @DynamicUpdate //自动更新日期 @Data //get/ ...

  7. English trip M1 - AC3 Teacher:Corrine

    课堂上内容 16,black,games The clothes is Only $. is lucky number in China. God give us black eyes,but we ...

  8. 二叉搜索树BST(Binary Search Tree)

    二叉搜索树(Binary Search Tree)也叫二叉排序树或二叉查找树.它满足以下性质: 1.非空左子树的所有键值小于其根结点的键值: 2.非空右子树的所有键值大于其根结点的键值: 3.左右子树 ...

  9. python记录_day08

    今日内容:文件操作 一.文件基本操作 f = open("文件路径和文件名", mode=" r", encoding="utf-8" ) ...

  10. 第二类Stirling数

    第二类斯特林数 第二类Stirling数:S2(p, k) 1.组合意义:第二类Stirling数计数的是把p个互异元素划分为k个非空集合的方法数 2.递推公式: S2(0, 0) = 1 S2(p, ...