在C#中从内存中运行本机(非托管)exe

时间:2010-10-09 18:16:24

标签: c# .net visual-studio performance security

你好,我有一些c程序,可以在我的c#程序中使用。 我不希望将这些c exe发送给客户端。这意味着我不希望用户可以看到这些exe。 我想将这些字节加载到内存并从内存中运行它。

我怎么能做到这一点。

非常感谢。

3 个答案:

答案 0 :(得分:2)

如果程序是非托管代码(C程序所在的代码),则无法直接从.Net内存中启动它。您可以做的是将其打包为资源,将其流式传输到磁盘(临时文件夹),然后使用System.Diagnostics.Process类启动它。但它会显示在流程列表中。

但是我同意@tdammers的评论,为什么你不能把它和你的程序一起包括在内?你为什么要隐藏它?

如果它已被管理,你可以获取嵌入式资源(exe文件),将其放入一个字节数组并使用Assembly.Load加载它。

如果你的C程序是一个dll,你可以嵌入资源,流到磁盘并使用p / invoke来执行它。

答案 1 :(得分:1)

我同意所有人都告诉你这是一个坏主意。但这绝非不可能。

你和在内存中的某个缓冲区中运行的代码之间唯一存在的就是DEP,调用VirtualProtectEx将解决这个问题(如果你在进程中加载​​代码而不是新进程,VirtualProtect(不是-Ex)就足够了)。确保缓冲区是固定的,不受垃圾收集器的影响(使用本机分配器可能是一个好主意)。

答案 2 :(得分:0)

这是不可能的,Windows的一个硬性要求是从磁盘上的文件启动和加载EXE。这是Windows设计方式的核心,与内存映射文件相关联。

您必须将非托管EXE与C#程序一起发货。做一些令人讨厌的事情,比如在运行时从资源中提取EXE,你的客户,她使用的病毒扫描程序和UAC都不会感激。您可以使用ProcessStartInfo.CreateNoWindow属性以静默方式运行它。