你好,我有一些c程序,可以在我的c#程序中使用。 我不希望将这些c exe发送给客户端。这意味着我不希望用户可以看到这些exe。 我想将这些字节加载到内存并从内存中运行它。
我怎么能做到这一点。
非常感谢。
答案 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属性以静默方式运行它。