【原创】 c#单文件绿色资源自更新
先引用dnlib.dll 更新程序先fody成一个文件
放置主程序资源文件 更新程序.exe
#region using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using dnlib.DotNet;
using dnlib.DotNet.Resources;
using dnlib.DotNet.Writer;
using dnlib.IO; #endregion namespace 更新程序
{
internal class Program
{
private static string FileExt { get; set; }
private static string Filename { get; set; }
private static void Main()
{
FileExt = Path.GetExtension(Properties.Resources.FileName);
Filename = Path.GetFileNameWithoutExtension(Properties.Resources.FileName);
UpDateResx();
DeleteItself();
} public static void UpDateResx()
{
string path = Properties.Resources.FileName;
string resxName = Properties.Resources.Name;
string resxValue = Properties.Resources.Value;
var processes = Process.GetProcesses();
Stopwatch st = new Stopwatch();
st.Start(); while (processes.FirstOrDefault(s => Filename == s.ProcessName) != null)
{
if (st.Elapsed > TimeSpan.FromSeconds())
{
return;
}
} ModuleDefMD module = ModuleDefMD.Load(path); EmbeddedResource resx =
(EmbeddedResource) module.Resources.Find(module.Assembly.Name + ".Properties.Resources.resources"); ResourceElementSet elementSet = ResourceReader.Read(module, resx.Data);
try
{
ResourceElement element = elementSet.ResourceElements.First(s => s.Name == resxName);
element.ResourceData = new BuiltInResourceData(ResourceTypeCode.String, resxValue);
elementSet.Add(element); MemoryStream ms = new MemoryStream();
ResourceWriter.Write(module, ms, elementSet);
resx.Data = new MemoryImageStream(, ms.GetBuffer(), , ms.GetBuffer().Length); if (module.IsILOnly)
module.Write(Filename+"_tmp"+FileExt, new ModuleWriterOptions(module));
else
module.NativeWrite(Filename + "_tmp" + FileExt);
}
catch (Exception e)
{
Console.WriteLine(e);
return;
}
module.Dispose(); } /// <summary>
/// 删除程序自身(本文地址:http://www.cnblogs.com/Interkey/p/DeleteItself.html)【推荐】
/// </summary>
private static void DeleteItself()
{
string selfName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);
string vBatFile = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + "\\DeleteItself.bat";
using (StreamWriter vStreamWriter = new StreamWriter(vBatFile, false, Encoding.Default))
{
vStreamWriter.Write(":move\r\n" +
$" move /Y {Filename}_tmp{FileExt} {Filename}{FileExt} \r\n" +
$"if exist {Filename}_tmp{FileExt} goto move\r\n" +
":del\r\n" +
$" del {selfName}\r\n" +
$"if exist {selfName} goto del\r\n" +
"del %0\r\n");
} //************ 执行批处理
WinExec(vBatFile, );
//************ 结束退出
Environment.Exit();
} [DllImport("kernel32.dll")]
public static extern uint WinExec(string lpCmdLine, uint uCmdShow);
}
}
主程序结束时中使用下列方法自更新资源
public static void WriteUpdate(string name,string value)
{
string selfName =Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); ModuleDefMD module = ModuleDefMD.Load(Properties.Resources.更新程序); EmbeddedResource resx =
(EmbeddedResource)module.Resources.Find(module.Assembly.Name + ".Properties.Resources.resources"); ResourceElementSet elementSet = dnlib.DotNet.Resources.ResourceReader.Read(module, resx.Data);
try
{
ResourceElement element = elementSet.ResourceElements.First(s => s.Name == "FileName");
element.ResourceData = new BuiltInResourceData(ResourceTypeCode.String, selfName);
elementSet.Add(element); ResourceElement element1 = elementSet.ResourceElements.First(s => s.Name == "Name");
element1.ResourceData = new BuiltInResourceData(ResourceTypeCode.String, name);
elementSet.Add(element1); ResourceElement element2 = elementSet.ResourceElements.First(s => s.Name == "Value");
element2.ResourceData = new BuiltInResourceData(ResourceTypeCode.String, value);
elementSet.Add(element2); MemoryStream ms = new MemoryStream();
dnlib.DotNet.Resources.ResourceWriter.Write(module, ms, elementSet);
resx.Data = new MemoryImageStream(, ms.GetBuffer(), , ms.GetBuffer().Length); if (module.IsILOnly)
module.Write("更新程序.exe", new ModuleWriterOptions(module));
else
module.NativeWrite("更新程序.exe");
}
catch (Exception e)
{
Console.WriteLine(e);
return;
}
module.Dispose();
ProcessStartInfo psi = new ProcessStartInfo("更新程序.exe");
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.CreateNoWindow = true;
Process.Start(psi);
Environment.Exit();
}
【原创】 c#单文件绿色资源自更新的更多相关文章
- 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5
前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...
- IE6 单文件绿色版
IE6单文件绿色版,可以直接运行,无需安装,完美兼容Win10(自带2016年1月更新). https://www.lanzous.com/i3w7dej
- 360随身WIFI程序单文件绿色版及网卡驱动(附使用感受)
大家好,我是Colin,今天刚收到传说中的360WIFI,拿到手后马上就进行了测试.就做工而言,19.9的价格算是比较公道的,网卡很小,做工还可以,带磨砂质感,而且还提供了一个耳机插头,可以当挂件一样 ...
- 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0
前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...
- 开源作品-ThinkPHP在线分析工具(单文件绿色版)-TPLogAnalysis_PHP_1_0
TPLogAnalysis_PHP_1_0 前言:项目开发基于ThinkPHP框架,但是在调试程序的时候,没有一款日志可视化分析工具.在网络也找不到任何相关的TP日志分析工具.求人不如求己,于是决定抽 ...
- 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0
前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...
- ResourceHacker(4.5.30)单文件绿色汉化版
经常编译软件的人,肯定会使用一些编译和反编译的工具,ResourceHacker作为一款资源编译工具,非常的小巧好用,ResourceHacker没有任何广告,支持打开.exe..dll..scr.. ...
- [转]数据恢复 文件恢复工具 DiskGenius v4.9.1 绿色专业版及单文件
必备神软!数据恢复及磁盘分区利器DiskGenius,目前最新版为v4.9.1,现在又有新思路的已注册专业版,已亲测可成功恢复4G以上的大文件,但不能虚拟磁盘格式转换!想用新版功能的有福了,推荐使用! ...
- [原创] 绿色单文件封装程序GreenOne V3.0
1.原理 将包含可执行文件的多个文件 调用Winrar,创建自解压格式压缩文件 设置高级自解压选项中的文本和图标,设置解压后运行的文件为选中的可执行文件. 这种创建单文件封装其实也就是一个Winrar ...
随机推荐
- javascript中函数的执行环境、作用域链、变量对象与活动对象
javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
- Hive HQL学习
HQL学习 1.hive的数据类型 2.hive_DDL 2.1创建.删除.修改.使用数据库 Default数据库,默认的,优先级相对于其他数据库是最高的 2.2重点:创建表_内部表_ ...
- Oracle_事务
Oracle_事务 -事物管理 create table account( id number, money number ); --实现转账操作 update ...
- Dig out WeChat deleted chat messages on Android Phone
As we know that WeChat will wipe deleted chat messages. That's why forensic guys could not dig out ...
- git只添加指定类型的文件的.gitignore规则
#忽略根目录下的所有文件 * #忽略子目录下的所有文件 /* #包含目录 !*/ #指定不忽略的文件 !*.c !*.h #忽略根目录下的文件 /build/ /appveyor/ /pear/ /s ...
- Cocoa的MVC架构分析
Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...
- linux下用iptables做本机端口转发方法(转载)
一 :从一台机到另一台机端口转发 启用网卡转发功能 #echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问1 ...
- Azure Automation Deploy (ARM)
以下说明仅是对虚拟机定时开关机的一个Demo,如果读者的定时任务比较复杂,需要通过修改Runbook脚本文件实现对应的功能. 1.创建automation账户 2.添加凭据 3.添加一个runbook ...
- WebService初入
WebService 1. WebService基本认识 WebService最早是微软提出了一种以XML为载体网络信息传输的规范,现在几乎所有的语言与平台都支持,带有状态机制,不依赖于容器,可以发送 ...