2009-08-28 63 views
3

如何执行MemoryStream中的程序,因此我不必先将它保存到硬盘。该文件可能不会缓存到硬盘上。该程序必须从内存中100%功能。从MemoryStream执行程序

 static string strTemplate = "MyAPP.SOMEprogram.exe"; 
     byte[] template; 
     int len = 0; 

     Assembly assembly = Assembly.GetExecutingAssembly(); 
     using (Stream stream = assembly.GetManifestResourceStream(strTemplate)) 
     { 

      len = (int)stream.Length; 
      BinaryReader reader = new BinaryReader(stream); 
      template = reader.ReadBytes(len); 


     } 

     MemoryStream ms = new MemoryStream(template, true); 

现在在MemoryStream(在RAM)上的所有100%的工作程序,我可以执行该程序吗? 很多谢谢

+1

我假设你不是在说只是加载托管程序集,对吧? – 2009-08-28 09:47:21

回答

2

我想不出一种明智的做法。我能想到的最接近的就是使用RAM光盘 - 您将无法访问硬盘(除了可能是分页),但这与您所问的内容仍然非常不同。

只是要说明的是,我说的是运行任意程序,而不是加载托管程序集。

+0

好吧,你最有用的评论,我如何使c#中的内存磁盘? – 2009-08-28 09:48:41

+1

您必须安装驱动程序,调用驱动程序API以创建新的RAM光盘,然后像普通驱动器一样使用它 - 将程序写入RAM光盘上的文件并执行它。 http://www.mydigitallife.info/2007/05/27/free-ramdisk-for-windows-vista-xp-2000-and-2003-server/列出了几个RAM光盘驱动程序,有些来源,但如何正确安装驱动程序并与其进行交互可能会严重依赖于您选择的驱动程序。你应该开始阅读文档和源代码(如果可用),然后看看如何继续。 – 2009-08-28 10:11:35

+0

谢谢,但所有问题是我做,也不希望用户看到FRM在哪里执行程序,我想要复制保护,RAM磁盘在这里可以帮助? – 2009-08-28 10:31:53

1

你可以试试Assembly.Load(byte[]),但你可能要解决的代码访问权限,有些杀毒软件可能不会让你做得一样好。

+0

是的,你是正确的Assembly.Load(字节[]),但它只适用于如果在该字节[]数组包含.net程序,否则不工作,我是对的? – 2009-08-28 09:35:45

+2

是的你是对的。如果你想在.net应用程序中运行作为资源嵌入的本机应用程序,请更新你的问题。 – 2009-08-28 09:38:42

1

的这里关键是要建立/从字节数组see在存储器加载的组件。一旦你有了对程序集的引用,你可以很容易地访问它的类型并实例化它们。一旦你有类型实例调用一个方法来“运行”你的程序。

+0

Assembly .. ::。Load方法(数组 []) 这是适用于在C++中编写而不在c#中编写程序的程序吗? 谢谢 – 2009-08-28 09:37:21

+0

不能在C#中工作。 – 2009-08-28 09:42:55

+0

为C++作品? – 2009-08-28 10:07:54