Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)

原文:Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)

程序如何自己更新自己呢?你可能会想到启动一个新的程序或者脚本来更新自己。然而 Windows 操作系统允许一个应用程序在运行期间修改自己的名称甚至移动自己到另一个文件夹中。利用这一点,我们可以很简单直接地做程序的 OTA 自动更新。

本文将介绍示例程序运行期间改名并解释其原理。


本文内容

    • 在程序运行期间手工改名
    • 不止是 exe 文件,dll 文件也是可以改名的
    • 为什么 Windows 上的可执行程序可以在运行期间改名?
    • 编写一个程序在运行期间自动改名

在程序运行期间手工改名

我们写一个简单的程序。

将它运行起来,然后删除。我们会发现无法删除它。

但是,我们却可以很轻松地在资源管理器中对它进行改名,甚至将它从一个文件夹中移动到另一个文件夹中。

值得注意的是,你不能跨驱动器移动此文件。

不止是 exe 文件,dll 文件也是可以改名的

实际上,不止是 exe 文件,在 exe 程序运行期间,即使用到了某些 dll 文件,这些 dll 文件也是可以改名的。

当然,一个 exe 的运行不一定在启动期间就加载好了所有的 dll,所以如果你在 exe 启动之后,某个 dll 加载之前改了那个 dll 的名称,那么会出现找不到 dll 的情况,可能导致程序崩溃。

为什么 Windows 上的可执行程序可以在运行期间改名?

Windows 的文件系统由两个主要的表示结构:一个是目录信息,它保存有关文件的元数据(如文件名、大小、属性和时间戳);第二个是文件的数据链。

当运行程序加载一个程序集的时候,会为此程序集创建一个内存映射文件。为了优化性能,往往只有实际用到的部分才会被加入到内存映射文件中;当需要用到程序集文件中的某块数据时,Windows 操作系统就会将需要的部分加载到内存中。但是,内存映射文件只会锁定文件的数据部分,以保证文件文件的数据不会被其他的进程修改。

这里就是关键,内存映射文件只会锁定文件的数据部分,而不会锁住文件元数据信息。这意味着你可以随意修改这些元数据信息而不会影响程序的正常运行。这就包括你可以修改文件名,或者把程序从一个文件夹下移动到另一个文件夹去。

但是跨驱动器移动文件,就意味着需要在原来的驱动器下删除文件,而这个操作会影响到文件的数据部分,所以此操作不被允许。

编写一个程序在运行期间自动改名

一般来说,需要 OTA 更新的程序是客户端程序,所以实际上真正需要此代码的是客户端应用。以下代码中我使用 .NET Core 3.0 来编写一个给自己改名的 WPF 程序。

using System.Diagnostics;
using System.IO;
using System.Windows;

namespace Walterlv.Windows.Updater
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            var fileName = Process.GetCurrentProcess().MainModule.FileName;
            var newFileName = Path.Combine(Path.GetDirectoryName(fileName), "OldUpdater.exe");
            File.Move(fileName, newFileName);
            // 省略的代码:将新下载下载的程序改名成 fileName。
        }
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

于是,程序自己在运行后会改名。

顺便的,以上代码仅适用于 .NET Framework 的桌面应用程序或者 .NET Core 3.0 的桌面应用程序。如果是 .NET Core 2.x,那么以上代码在获取到进程名称的时候可能是 dotnet.exe(已发布的 .NET Core 程序除外)。



参考资料



我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。


walter lv

博客专家

发布了382 篇原创文章 · 获赞 232 · 访问量 47万+

私信
关注

原文地址:https://www.cnblogs.com/lonelyxmas/p/12052017.html

时间: 2024-11-03 01:26:30

Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)的相关文章

如何在Windows上安装FFmpeg程序

如何在Windows上安装FFmpeg程序 由 Yutao 编辑 2 方法:下载FFmpeg在命令行中开启FFmpeg FFmpeg程序进行各种媒体格式的转换,从而它们可以在不同设备上播放.该程序只有命令行模式,因此将它安装到计算机中看上去有些令人生畏,但是只要根据本指南的方法,你只需要几分钟就可以将FFmpeg安装成功! 广告 方法 1: 下载FFmpeg 1 下载FFmpeg.访问下载页面时,你将看到很多不同下载选项.你可以根据自己的操作系统选择下载最新的32位或64位静态程序版本.广告 2

windows下python脚本程序的运行

c:\python33\python.exe c:\python33\trycoding.py windows下python脚本程序的运行,布布扣,bubuko.com

在Windows上安装FFmpeg程序

原文地址:http://helloway.blog.51cto.com/7666282/1642247 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序只有命令行模式,因此安装到Windows下时,它与一般安装程序不同,具体安装步骤如下: 一.FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 你可以根据自己的操

关于如何删除windows上的顽固程序

举例说明吧 现在机器上有一个hello.exe的程序怎么也删除不掉,而且到任务管理器里面,发现其在运行,但是任务管理器结束该进程后,hello.exe又自动运行(不管什么机制),结果是你还是删不掉hello.exe 到底是谁启动了hello.exe我们不关心,反正肯定是保护程序,那我们如何在保护程序启动hello.exe前就删掉他呢,那就是下面脚本能做的事情了: 前提找到正在运行的hello.exe的进程id值然后运行如下内容的hello.bat文件即可 del -f hello.exe kil

Android 在Windows上安装FFmpeg程序

FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序只有命令行模式,因此安装到Windows下时,它与一般安装程序不同,具体安装步骤如下: 一.FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 你可以根据自己的操作系统选择下载最新的32位或64位静态程序版本: 二.下载并解压FFmpeg文件夹,它会生成一个类似名为

Windows上发布Qt的可执行程序

这两天抽时间写了个截图工具,在运行release后,想发布下,最后发现点击里面.exe文件报错Qt的库文件缺失,所以学习了下在windows上发布Qt程序的方法,具体操作步骤如下: 1.在Qt Creator下用release跑一遍程序,生成相应的exe文件,也就是可执行文件. 2.在开始菜单搜索Qt,然后运行Qt 5.3 for Desktop (MinGW 4.8 32 bit) (我用的是Qt5.3.2,不同版本,名字不同). 3.打开window是的终端命令模式,然后进入你的exe文件的

windows上eclipse搭建hadoop开发环境(自用,备忘)

注:本文为自用,随时更新. 一.系统环境 Windows7.Ecplise 4.4.0,Hadoop2.7.2 Hadoop安装教程请看:Hadoop2.7.2安装教程 此处需要注意的是:你的hadoop运行在远程的虚拟机上,但是你的windows上也需要有hadoop的运行环境,这样eclipse才能进行远程调试,所按照上面教程安装完虚拟机上的hadoop,还需要下载同样版本的Hadoop加压到windows上即可,还需要配置相应的环境变量,拷贝winutil.exe.hadoop.dll等文

Windows上安装Mac OS

在windows上开发ios程序,是一件比较痛苦的事情,因为: 开发android程序,使用eclipse,eclipse有windows版同时也有mac版,所以mac上开发android程序和windows上没有多大差别: 但是,开发ios程序,使用Xcode,然而Xcode却没有windows版的,这时需要在windows开发ios程序,办法只有一个:安装虚拟机,在虚拟机上安装Mac OS. 如果你是土豪,你有mac本,完全可以不看这篇文章!!! VMware 12安装Mac OS X 10

转:visualvm监控远程机器上的Java程序

转自:http://hanwangkun.iteye.com/blog/1195526 JDK里面本身就带了很多的监控工具,如JConsole等.我们今天要讲的这款工具visualvm,就是其中的一款.但是这款工具是在JDK1.6.07及以上才有的.它能够对JAVA程序的JVM堆.线程.类加载情况.JVM GC情况进行监控,是一个很好的免费的监控工具. 监控范围:JDK1.4及以上版本的程序都能够监控. 它在JDK里面叫做: jvisualvm,当然我们可以到它的官方网站上去下载它的最新版本,当