先引用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#单文件绿色资源自更新的更多相关文章

  1. 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5

    前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...

  2. IE6 单文件绿色版

    IE6单文件绿色版,可以直接运行,无需安装,完美兼容Win10(自带2016年1月更新). https://www.lanzous.com/i3w7dej

  3. 360随身WIFI程序单文件绿色版及网卡驱动(附使用感受)

    大家好,我是Colin,今天刚收到传说中的360WIFI,拿到手后马上就进行了测试.就做工而言,19.9的价格算是比较公道的,网卡很小,做工还可以,带磨砂质感,而且还提供了一个耳机插头,可以当挂件一样 ...

  4. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0

    前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...

  5. 开源作品-ThinkPHP在线分析工具(单文件绿色版)-TPLogAnalysis_PHP_1_0

    TPLogAnalysis_PHP_1_0 前言:项目开发基于ThinkPHP框架,但是在调试程序的时候,没有一款日志可视化分析工具.在网络也找不到任何相关的TP日志分析工具.求人不如求己,于是决定抽 ...

  6. 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0

    前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...

  7. ResourceHacker(4.5.30)单文件绿色汉化版

    经常编译软件的人,肯定会使用一些编译和反编译的工具,ResourceHacker作为一款资源编译工具,非常的小巧好用,ResourceHacker没有任何广告,支持打开.exe..dll..scr.. ...

  8. [转]数据恢复 文件恢复工具 DiskGenius v4.9.1 绿色专业版及单文件

    必备神软!数据恢复及磁盘分区利器DiskGenius,目前最新版为v4.9.1,现在又有新思路的已注册专业版,已亲测可成功恢复4G以上的大文件,但不能虚拟磁盘格式转换!想用新版功能的有福了,推荐使用! ...

  9. [原创] 绿色单文件封装程序GreenOne V3.0

    1.原理 将包含可执行文件的多个文件 调用Winrar,创建自解压格式压缩文件 设置高级自解压选项中的文本和图标,设置解压后运行的文件为选中的可执行文件. 这种创建单文件封装其实也就是一个Winrar ...

随机推荐

  1. javascript中函数的执行环境、作用域链、变量对象与活动对象

    javascript高级程序设计中:对执行环境.作用域链.变量对象.活动对象的解释: 1.执行环境: 执行环境:有时也叫环境:是JavaScript中最为重要的一个概念:执行环境定义了变量或函数有权访 ...

  2. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

  3. Hive HQL学习

    HQL学习   1.hive的数据类型 2.hive_DDL 2.1创建.删除.修改.使用数据库     Default数据库,默认的,优先级相对于其他数据库是最高的   2.2重点:创建表_内部表_ ...

  4. Oracle_事务

    Oracle_事务 -事物管理   create table account(        id number,        money number );     --实现转账操作 update ...

  5. 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 ...

  6. git只添加指定类型的文件的.gitignore规则

    #忽略根目录下的所有文件 * #忽略子目录下的所有文件 /* #包含目录 !*/ #指定不忽略的文件 !*.c !*.h #忽略根目录下的文件 /build/ /appveyor/ /pear/ /s ...

  7. Cocoa的MVC架构分析

    Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...

  8. linux下用iptables做本机端口转发方法(转载)

    一 :从一台机到另一台机端口转发 启用网卡转发功能 #echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问1 ...

  9. Azure Automation Deploy (ARM)

    以下说明仅是对虚拟机定时开关机的一个Demo,如果读者的定时任务比较复杂,需要通过修改Runbook脚本文件实现对应的功能. 1.创建automation账户 2.添加凭据 3.添加一个runbook ...

  10. WebService初入

    WebService 1. WebService基本认识 WebService最早是微软提出了一种以XML为载体网络信息传输的规范,现在几乎所有的语言与平台都支持,带有状态机制,不依赖于容器,可以发送 ...