0x9*_*x90 4 c# windows file-handling
我正在使用C#中的应用程序执行以下操作:
Process.Start()我现在正在努力确保EXE一旦关闭就会被删除.最简单的方法是FileOptions.DeleteOnClose在创建EXE时使用设置参数File.Create.
但是,这意味着EXE在使用时无法执行.关闭文件句柄后,EXE会立即删除,然后才能执行.
有没有办法在我的应用程序中保留对EXE的"弱引用",它不会锁定文件并允许它被执行?或者,有没有办法解锁EXE执行文件句柄仍然打开?我还缺少其他明显的解决方案吗?
澄清答:我知道其他删除正在使用的文件的方法,最终会删除文件(例如重启时).然而,我正在寻找一种方法,一旦它开始执行就立即删除该文件由操作系统处理(例如,当运行首先执行该文件然后删除它的批处理时,如果批处理作业终止,该文件将保留在磁盘上).
澄清B:解释更大的图片:应用程序接收和解密可执行文件.解密后,应该执行该文件.但是,我想确保解密版本的EXE不会保留在磁盘上.理想情况下,我还想阻止用户复制解密的EXE.但是,由于解密应用程序作为同一用户运行,因此无法以真正安全的方式实现,因为两者在系统上具有相同的权限.
您可以使用Process.WaitForExit:
var process = Process.Start(processPath);
process.WaitForExit();
// File.Delete(processPath); // Not strong enough (thanks to Binary Worrier)
DeleteOrDie(processPath); // Will attempts anything to delete the file.
Run Code Online (Sandbox Code Playgroud)
但是它提供了从你写的地方复制exe的可能性.
一个好的解决方案是从内存中运行它.
如果你的目标exe是一个CLR程序,你可以使用Assembly.Load函数:
// read the file and put data in bin
...
Assembly a = Assembly.Load(bin);
MethodInfo method = a.EntryPoint;
if (method == null) throw new NoEntryPointException();
object o = a.CreateInstance(method.Name);
method.Invoke(o, null);
Run Code Online (Sandbox Code Playgroud)
更多细节在这里.
如果你想在内存中加载/执行任何exe,你可以使用Nebbett的Shuttle方法,但你需要用C/C++编写它并从C#调用它.
此外,它看起来像微软不喜欢它(安全问题),我不认为你只能从C#实现它.良好的反病毒可能会检测到它.
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |