先引用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. IntelliJ IDEA 配置 smartGit

    教你如何在IntelliJ IDEA中配置smartGit? 一.第一种方式: 1.在启动IDEA工具时,点击下拉按钮"Check out from Version Control" ...

  2. 详解用em替换px

    em 的实际大小是相对于其上下文的字体大小而言的.如果我们给<body>标签设置文字大小为 100%,给其他文字都使用相对单位 em,那这些文字都会受body 上的初始声明的影响.这样做的 ...

  3. Composer 是什么

    简单来说,Composer 是一个新的安装包管理工具,服务于 PHP 生态系统.它实际上包含了两个部分:Composer 和 Packagist.下面我们就简单说一下他们各自的用途. Composer ...

  4. android 基础04-BroadCastReceiver

    Android 系统中的广播(BroadCast) 是组件与组件进行的一种可跨线程的通信方式.类似于 广播者-订阅者(publish-subscribe) 的实现,当系统或者某个应用的状态发生改变时, ...

  5. SNMP PDU解析

    (注:此文章仅为个人学习,研究,原创作者:Penguinbupt,原创文章网址:http://blog.csdn.net/u010566813/article/details/50490858) SN ...

  6. CentOS 6.3 64位下MySQL5.1.54源码安装配置详解

    安装环境:CentOS 6.3 64位 一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* 新建mysql用户 [root@clien ...

  7. python3的一些改动常用到的

    更多的内容会接下来说明,只举几个例子. https://docs.python.org/2/library/2to3.html 1. map的输出,要在前面加list转化 2. map(lambda ...

  8. js_3_for_if_try

    在js中有哪些特殊变量? null 指向一个空地址,一个特殊的地址 var u 定义了一个特殊变量u,类型未定义,boolean(u)=false js中的for循环是什么样子? 对列表: for(v ...

  9. maven多模块搭建

    此时你会发现父模块含有如下内容 这是因为创建的maven项目都带有样例,比如上图的这张图片 各种artifact都是做什么的呢,@参考文章中给出了答案 怎么创建不带这些呢? 那就创建simple pr ...

  10. SQL 优化经验总结34条(转)

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...