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()将这个文件删除即可。

 

posted @ 2017-11-27 11:03  York_Zhang  阅读(1666)  评论(0编辑  收藏  举报