2010-04-08 90 views
6

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

C#/。NET Compact Framework的2 /的Windows Mobile 6

请,我不想讨论为什么这样做,我只需要知道怎么办呢

重要:

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

  • 强制重新启动时没有问题,如果Windows在启动时有窍门。 (这可能吗?很好,告诉我怎么做!)。

  • 欢迎使用代码示例。

回答

1

我已经完成了这一点,只需将一个批处理文件写入文件系统,该文件系统将等待几秒钟,然后删除该程序。然后使用Process.Start()启动批处理文件并立即呼叫Environment.Exit()。您需要确保批处理文件等待足够长的时间才能关闭程序,否则将无法工作。

+2

除了批处理文件,在Windows Mobile ... 不支持,你写的任何文件进行沃尔德则存在留下的面包屑。 – ctacke 2010-04-08 22:50:02

5

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

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

  1. 解压CAB文件系统
  2. 执行wceload.exe与CAB作为参数和/ NOUI(或/静音)
  3. 退出你的应用程序

CAB然后删除您的文件(一个已命名的互斥体可以比DLL中的Sleep调用更好地进行同步)。 wceload会自动删除CAB(取决于WinMo版本,但有必要的话可以强制删除)。

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

-1

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

MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); 

我不知道如果API是提供移动6与否。但是,它实际上是在HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ PendingFileRenameOperations中创建一个注册表项。关键是一个REG_MULI_SZ,你只需要给它一个值,如“szDstFile \ 0 \ 0”。重新启动时,Windows将删除该文件。

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

+1

不幸的是在CE下不支持。 – ctacke 2010-04-09 01:15:35

1

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

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);