【问题标题】:How to programmatically self delete? (C# WinMobile)如何以编程方式自我删除? (C# WinMobile)
【发布时间】:2011-02-05 21:47:16
【问题描述】:

如何以编程方式自我删除?

C# / .NET Compact Framework 2 / Windows Mobile 6

拜托,我不想讨论为什么要这样做,我只想知道怎么做

重要:

  • “第二次申请”方法不是一种选择。 (除非可以从正在运行的应用程序中“提取”第二个应用程序,但我不知道该怎么做!)。

  • 如果 Windows 在启动时执行此操作,则强制重启没有问题。 (有可能吗?很好!告诉我怎么做!)。

  • 欢迎提供代码示例。

【问题讨论】:

    标签: c# windows-mobile


    【解决方案1】:

    我能想到的临时删除自己并且不留下任何痕迹的唯一方法是使用设备中已经存在的东西 - 即 wceload(CAB 提取器)。我会使用自定义安装程序 DLL 创建一个简单的 CAB 文件,该文件会等待然后删除。

    然后,我会将 CAB 作为嵌入式资源添加到应用程序中。当你需要删除你时

    1. 将 CAB 解压到文件系统
    2. 以 CAB 作为参数和 /noui(或 /silent)执行 wceload.exe
    3. 退出您的应用程序

    然后 CAB 会删除您的文件(命名互斥锁可以比 DLL 中的睡眠调用更好地同步此文件)。 wceload 自动删除 CAB(取决于 WinMo 版本,但如有必要,有一个强制删除的开关)。

    这当然是一个 hack,但它会提供“不留痕迹”删除。当然,CAB 可能还必须清理它自己的安装注册表项。也许您可以让安装返回“失败”,以防止它们首先被写入。

    【讨论】:

      【解决方案2】:

      我正在使用此代码,它工作正常

      string AppPath = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location).ToString() + "\\Uninstaller.exe";
      
      ProcessStartInfo Info = new ProcessStartInfo();
      Info.Arguments = "/C choice /C Y /N /D Y /T 0 & Del " + AppPath;
      Info.WindowStyle = ProcessWindowStyle.Hidden;
      Info.CreateNoWindow = true;
      Info.FileName = "cmd.exe";
      Process.Start(Info);
      

      【讨论】:

        【解决方案3】:

        过去我通过简单地将批处理文件写入文件系统来完成此操作,该文件系统将等待几秒钟然后删除程序。然后使用Process.Start() 启动批处理文件并立即调用Environment.Exit()。您需要确保批处理文件等待足够长的时间让您的程序关闭,否则它将无法运行。

        【讨论】:

        • 除了批处理文件在 Windows Mobile 中不受支持...而且您写出的任何文件都会出现,留下面包屑。
        【解决方案4】:

        Windows 可以在启动时删除文件。可以通过调用MoveFileEx 来完成,例如:

        MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
        

        我不确定该 API 在 Mobile 6 中是否可用。但是,它实际上是在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 中创建一个注册表项。关键是一个 REG_MULI_SZ,你只需要给它一个像“szDstFile\0\0”这样的值。重新启动时,Windows 会删除该文件。

        至于以编程方式重新启动,请查看 SO 上的 this 线程。

        【讨论】:

        • 很遗憾在 CE 下不受支持。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2011-02-10
        • 2013-12-22
        • 2011-04-24
        • 1970-01-01
        相关资源
        最近更新 更多