如何以编程方式自行删除? (C#WinMobile)

时间:2010-04-08 21:19:00

标签: c# windows-mobile

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

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

请,我不想讨论为什么要这样做,我只需要知道如何做到

重要的:

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

  • 强制重启没问题,如果windows在启动时做了伎俩。 (有可能吗?很好!告诉我怎么做!)。

  • 欢迎使用代码示例。

4 个答案:

答案 0 :(得分:6)

我能想到的唯一方法就是使用已经存在于设备中的东西 - 即wceload(CAB提取器)。我创建了一个简单的CAB文件,其中包含一个自定义安装程序DLL,它执行等待然后删除。

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

  1. 将CAB解压缩到文件系统
  2. 以CAB作为参数和/ noui(或/ silent)
  3. 执行wceload.exe
  4. 退出您的申请
  5. CAB然后删除你的文件(一个命名的互斥锁可以比DLL中的Sleep调用更好地同步它)。 wceload会自动删除CAB(很好地取决于WinMo版本,但如果需要,还有一个强制删除的开关。)

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

答案 1 :(得分: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);

答案 2 :(得分:1)

我过去只是将批处理文件写入文件系统,等待几秒钟然后删除程序。然后使用Process.Start()启动批处理文件并立即调用Environment.Exit()。您需要确保批处理文件等待足够长的时间才能关闭程序,否则它将无效。

答案 3 :(得分:-1)

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线程。