【原创】 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 ...
随机推荐
- UEP-级联查询
级联查询在UEP中采用动态下拉的形式,cascadeid为关键字,注意jsp页面的id的相互嵌套关系,数据库字段的数值的设置,和动态下拉SQL语句的书写.本功能实现了省市区的三级联动查询
- 浅析const、let与var
以前无论声明变量还是常量,总是使用var一勺端,知道接触了es6之后,发现原来变量.常量的声明其实是很讲究的. 这里简单来谈谈var.const与let. 1.var.var声明的变量没有块级作用域, ...
- iOS微信自动抢红包插件(支持后台和锁屏下抢红包)
前言:本文主要讲述使用hook方式实现红包插件,涉及到tweak相关知识,如果你不想了解具体实现细节可直接到我的Github地址参考安装(包含越狱和非越狱两种方法) 转眼间2017即将过去,又到了 ...
- WIN2016安装织梦没写入权限怎么办听语音
配置好了WINSERVER2016环境,一切看起来都弄得差不多了,可是安装织梦的时候提示我没有写入权限,不能继续安装,于是我很郁闷,开始寻求解决办法. 工具/原料 WINSERVER2016 织梦5. ...
- 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???
求android开发的高手帮我看看这个问题吧: <activity android:name=".SecondActivity" android:label="Th ...
- 【绘图技巧】ps快捷键的用法
Ctrl+N:新建画布 Ctrl+O:打开对话框 F: 在三种画布中切换 Z:缩放工具(临时) Ctrl+0:满画面显示 空格:切换到手(临时) Ctrl+":网 ...
- Insert Sort Singly List
对单链表插入排序,给出个单链表的head节点:返回排完序的head节点: 首先数据结构中习惯了以数组为参数排序,瞬间想到是遍历单链表存入arraylist中,再进行insert sort,(O(n** ...
- JavaScript对象的valueOf()方法
js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...
- Nginx日志中的金矿 -- 好文收藏
转:http://www.infoq.com/cn/articles/nignx-log-goldmine Nginx(读作Engine-X)是现在最流行的负载均衡和反向代理服务器之一.如果你是一名中 ...
- RocketMQ环境搭建(双master模式)
介绍: 多Master模式,一个集群无Slave,全是Master,例如2个Master或者3个Master. 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时, ...