如何以编程方式自行删除?
C#/ .NET Compact Framework 2 / Windows Mobile 6
请,我不想讨论为什么要这样做,我只需要知道如何做到!
重要的:
“第二次申请”方法不是一种选择。 (除非第二个应用程序可以从正在运行的应用程序中“提取”,但我不知道该怎么做!)。
强制重启没问题,如果windows在启动时做了伎俩。 (有可能吗?很好!告诉我怎么做!)。
欢迎使用代码示例。
答案 0 :(得分:6)
我能想到的唯一方法就是使用已经存在于设备中的东西 - 即wceload(CAB提取器)。我创建了一个简单的CAB文件,其中包含一个自定义安装程序DLL,它执行等待然后删除。
然后我将CAB作为嵌入式资源添加到应用程序中。当您需要删除时
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线程。