Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > запустить процесс из Memory


Автор: 12usver12 12.3.2008, 21:15
хочу написать что-то похожее на упаковщик исполняемых файлов,
допустим после всех действий я получил массив байтов распакованного
приложения, если кто знает как теперь этот массив байтов(приложение) запустить из памяти, а не сохраняя на диск и запуская оттуда ?

Автор: 12usver12 13.3.2008, 22:43
да никто наверн не подскажет... smile 

Автор: ivashkanet 14.3.2008, 09:38
Цитата

public static Assembly Load(byte[] rawAssembly)

Loads the assembly with a Common Object File Format (COFF)-based image containing an emitted assembly. The assembly is loaded into the domain of the caller.
Parameters
rawAssembly
An array of type byte that is a COFF-based image containing an emitted assembly. 
Return Value
The loaded assembly.


Автор: tol05 14.3.2008, 12:38
Цитата(12usver12 @  13.3.2008,  21:43 Найти цитируемый пост)
да никто наверн не подскажет... 

Отчего не веришь в наши силы smile , товарищ? 

ivashkanet, респект smile 

вот накопал пример http://blog.devexperience.net/en/9/Load_an_EXE_file_and_run_it_from_memory.aspx

Автор: 12usver12 14.3.2008, 12:41
будем пробовать
Извините товарищи  smile 
я был не прав  smile 

Автор: ivashkanet 14.3.2008, 13:24
12usver12, мы по вечерам дома с женами, а не в инете на форуме smile 
Цитата(tol05 @  14.3.2008,  11:38 Найти цитируемый пост)
ivashkanet, респект

Стараюса

Автор: 12usver12 14.3.2008, 23:17
после многих попыток так и не получилось
все доходит до вот такого кода 
Код

FileStream fs = new FileStream(filePath, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();
// load the bytes into Assembly

Assembly a = Assembly.Load(bin);

// search for the Entry Point

MethodInfo method = a.EntryPoint;
if (method != null) {
...
}
// create an istance of the Startup form Main method

object o = a.CreateInstance(method.Name);
// invoke the application starting point

method.Invoke(o, null);


который не работает и вот такой тоже
 ,

Код

 try
      {
         Assembly asm = Assembly.Load(pBuf);
         asm.EntryPoint.Invoke(null,null);
      }
 или может я чото неправильно делаю ?

Автор: altarvic 17.3.2008, 07:53
Какой тип запускаемого приложения (managed/native) ? Этот код будет работать ТОЛЬКО с managed.

Автор: 12usver12 17.3.2008, 10:13
вообщем и .Net сборки не запускаются и и не .Net  smile 
я так понял managed - это.Net ?  а native  это родные для процев ? 

Автор: ivashkanet 17.3.2008, 10:30
Цитата(12usver12 @  17.3.2008,  09:13 Найти цитируемый пост)
вообщем и .Net сборки не запускаются и и не .Net 

1) не .net сборку даже не стоит пытаться так загруить! Там же написано: Assembly.Load() Единственно -- сохранить на диске, а потом с него, либо аналог Assembly.Load но для PE файлов (не знаю про такое)
2) Net сборки должны загружаться!
Цитата(12usver12 @  17.3.2008,  09:13 Найти цитируемый пост)
я так понял managed - это.Net ?  а native  это родные для процев ?  

Так точно.

Цитата(12usver12 @  14.3.2008,  22:17 Найти цитируемый пост)
который не работает и вот такой тоже

Какой эксепшен выкидывает?

Автор: 12usver12 17.3.2008, 11:57
вот есть такая http://www.codeguru.com/csharp/csharp/cs_misc/security/print.php/c8309
и там есть http://www.geocities.com/krishnapg/SecureAssembly.zip  
и он рабочий проделываю подобные операции опять не получается.

вот такой эксепшн : "SetCompatibleTextRenderingDefault must be called before the first IWin32Window object is created in the application."

to ivashkanet не могу понять с твоих слов - ты хоч сказать что .Net екзешник из памяти вообще нельзя запустить ?

  

Автор: ivashkanet 17.3.2008, 12:27
Цитата(12usver12 @  17.3.2008,  10:57 Найти цитируемый пост)
ты хоч сказать что .Net екзешник из памяти вообще нельзя запустить

Я хочу сказать что можно!
Цитата(12usver12 @  17.3.2008,  10:57 Найти цитируемый пост)
"SetCompatibleTextRenderingDefault must be called before the first IWin32Window object is created in the application."

Тогда сборка у тебя загружается, но вот энтри поинт вызвать не удается. И судя по всему потому что ты из WinForms запускаешь еще один WinForms и он ругается на это:
Цитата
"SetCompatibleTextRenderingDefault должен быть вызван перед созданием первого объекта в приложении"
 а у тебя, судя по всему, уже есть окна (главное приложение). Вот и ругается.

Старожил форума: Вопрос заявленный в теме решен. Разбираться с вызовом одного WinForms приложения из другого настоятельно рекомендую в другой теме!

Автор: 12usver12 17.3.2008, 13:44
Цитата

И судя по всему потому что ты из WinForms запускаешь еще один WinForms
 
так оно и было.
вопрос я думаю решен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)