.NET:将EXE文件嵌入我的项目中

7

我知道这是一个奇怪的情况,但我需要将一个EXE文件(或汇编代码)嵌入到我的项目中,这样它只能被应用程序启动(不能在文件系统中创建EXE并启动它)...

这可行吗?

编辑:

这不是.NET EXE。无论如何,我已将Test.exe文件作为资源添加到我的项目中,并执行了以下操作

   Dim exestr As Stream = Nothing
   Dim a As Assembly = Assembly.GetExecutingAssembly
   exestr = a.GetManifestResourceStream("Test.exe")  

这是不可能的。你为什么要尝试做这件事? - SLaks
不可能。必须创建文件。也许你可以使用FILE_DELETE_ON_CLOSE标志创建它,这样在使用完毕后会自动删除。或者使用FILE_ATTRIBUTE_TEMPORARY标志创建文件,这样如果你在最后删除它,它将不会被写入实际驱动器,但这只有助于性能,文件仍然可在文件资源管理器中看到。 - undefined
3个回答

5

不可能。这是Dave Cutler和其他人在设计Windows NT时做出的核心设计决策之一。进程必须由文件系统上的文件支持。Windows使用内存映射文件将进程代码映射到虚拟内存。这对于.NET程序并没有什么不同,即使它的大部分代码被JIT编译到内存中,包含IL的程序集也是以相同的方式进行映射。

这不仅有助于操作系统的高效运行,而且用户和病毒扫描器也不喜欢突然出现的可执行代码。


4
如果EXE是.NET汇编程序,您可以将编译好的二进制文件嵌入到您的(外部)程序中,并使用Assembly.Load(byte[])进行加载。 编辑:由于不是NET汇编程序,因此无法执行此操作。
加载程序集后,您可以像调用其他程序集一样调用内部程序集中的函数(例如Main方法),或者您可以编写AppDomain.CurrentDomain.ExecuteAssembly(innerAssembly.FullName)

我会把这个答案留做参考。 - SLaks

2
我在考虑创建一个RAM磁盘,从你的.NET资源文件中将exe文件写入其中,然后在那里执行该文件。没有接触到物理磁盘。
我没有可编程的RAM磁盘API链接,但你可能可以在程序中找到一些可操纵的东西。另一个好处是病毒扫描器仍然可以扫描它以确保安全性。
此外,我认为如果你的应用程序正在磁盘上运行,那么没有什么理由不将相关的可执行文件也放在磁盘上。如果你通过网络(下载)进行传输,那么首先保存到磁盘,执行完成后再删除

谢谢,我会尝试的,希望能行... 无论如何,我不想编写和打开文件,因为用户不应该复制第二个exe并在需要时启动它。 - Marcx
最终是使用RAM磁盘解决方案吗?只是好奇。如果是,你用什么软件来实现它? - John K
我认为这个问题在于RAM磁盘需要预先安装第三方软件。如果你能做到这一点,为什么不直接写入文件系统呢? - Joel McBeth
如果你想防止用户保存exe文件的副本,那么内存盘根本无法帮到你,因为用户可以像访问任何普通驱动器一样查看内存盘的内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接