C#.NET 将第三方exe在启动前隐藏起来,只在调用时恢复并再调用后删掉
笔者最近在做一个应用程序,应用程序需要用process.start()启动一个第三方的exe。但是如果一个软件包里有两个exe文件,可能会对最终用户使用时造成一些困扰,而且我们也不想让用户单独启动这个第三方应用程序。
也就是说,我们需要把这个第三方exe文件隐藏起来。有几种方案,比如对这个文件反复更名,或者压缩,但是都是不够优雅的做法。
实际上,可以利用.NET的“资源“将这个文件藏在编译后的资源文件中,只有运行时将其拿出来运行,运行结束后将其删除即可。资源文件除了exe也可以存储其他的二进制文件,比如图片、声音文件等等,这样就对这些文件起到了保护的作用。
具体做法如下:
1. 在Visual Studio里将exe文件拖入工程项目中,并为它建一个目录:
它的属性应为“”不复制“和“无“。
2. 点击工程--属性--资源,将这个文件拖入右侧的表格中。你会发现表格消失,exe文件成为了一个icon出现在里面。
3. 在工程代码里使用Properties.Resources.<资源名>在运行时可以调用, 我这边在主界面上调用了它并用一个Generateexe()的方法来用文件IO生成exe文件:
主界面调用:
string fullPath = Application.StartupPath + @"\Unity\" + UnityExeFileName; ExeManager.GenerateExe(Properties.Resources.UnityDemo, fullPath);
生成EXE文件的方法:
public static void GenerateExe(byte[] FileBytes, string DestinationPath) { fullPath = DestinationPath; try { //1) Fetch Exe file content from Resources byte[] memoryFile = FileBytes; //2) Create file to be deleted complete execution FileStream aFile = new FileStream(DestinationPath, FileMode.Create, FileAccess.Write, FileShare.None, 20000, FileOptions.None); //3) Write Exe file content aFile.Write(memoryFile, 0, memoryFile.Length); aFile.Flush(); aFile.Close(); Thread.Sleep(100); } catch (Exception e) { Console.WriteLine(e.Message); DeleteExeFile(); } }
主程序运行结束时再用File.Delete()将这个文件删除即可。