2009-08-28 1 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); 

Теперь вся 100% рабочая программа в MemoryStream (в ОЗУ), могу ли я выполнить эту программу? Many Thanks

+1

Я предполагаю, что вы не говорите только о загрузке управляемой сборки, не так ли? –

ответ

2

Я не могу придумать способ obviouse для этого. Самое близкое, что я могу придумать, это использовать RAM-диск - у вас не будет доступа к жесткому диску (кроме, возможно, подкачки), но это все еще сильно отличается от того, что вы просите.

Просто хочу отметить, что я говорю о запуске произвольных программ, а не о загрузке управляемых сборок.

+0

ok, вы комментируете наиболее полезный, как я могу сделать диск в C#? –

+1

Вам нужно будет установить драйвер, вызвать API-интерфейс драйвера, чтобы создать новый RAM-диск, а затем вы можете использовать его, как каждый обычный диск, - напишите свою программу в файл на диске RAM и выполните ее. http://www.mydigitallife.info/2007/05/27/free-ramdisk-for-windows-vista-xp-2000-and-2003-server/ перечисляет несколько драйверов дисков RAM, некоторые из них поставляются с источником, но как точно установить драйвер и взаимодействовать с ним, вероятно, будет сильно зависеть от выбранного вами драйвера. Вы должны начать чтение документации и источника (если доступно), а затем посмотреть, как продолжить. –

+0

спасибо, но вся проблема в том, что я делаю и не хочу, чтобы пользователь видел frm, где была выполнена программа, я хочу, чтобы защита от копирования, RAM-диск здесь может помочь? –

1

Вы можете попробовать Assembly.Load(byte[]), но вам, возможно, придется обойти права доступа к коду, и некоторые антивирусы могут не позволить вам это сделать.

+0

yes you right Assembly.Load (byte []), но он работает только в том случае, если в этом байте [] массив содержит .net-программу, иначе не работает, я прав? –

+2

Да, вы правы. Пожалуйста, обновите свой вопрос, чтобы упомянуть об этом, если вы хотите запускать собственные приложения, встроенные в качестве ресурса в приложении .net. –

1

Ключ здесь состоит в том, чтобы собрать/загрузить сборку в памяти из массива байтов see. Когда у вас есть ссылка на сборку, вы можете легко получить доступ к ее типам и создать их. После того, как вы получили экземпляры типов, вызовите метод, чтобы он «запускал» вашу программу.

+0

Assembly .. ::. Метод загрузки (массив []) это работает для программ, которые налагаются на C++, а не в C# ?? спасибо –

+0

Nope работает в C# тоже. –

+0

для C++ works ??? –

Смежные вопросы