2016-02-18 3 views
3

Я использую Costura.Fody.C#: Как вставить exe-файл в ресурсы?

Существует приложение Test.exe, который работает pocess internalTest.exe таким образом:

 ProcessStartInfo prcInfo = new ProcessStartInfo(strpath) 
     { 
      CreateNoWindow = false, 
      UseShellExecute = true, 
      Verb = "runas", 
      WindowStyle = ProcessWindowStyle.Normal 
     }; 
     var p = Process.Start(prcInfo); 

Теперь мне нужно предоставить 2 исполняемые файлы пользователя.

Можно ли встроить internalTest.exe и запустить его?

+1

Должно быть легко добавить файл в ресурсы и во время выполнения сохранить его как временный файл и запустить его в обычном режиме. – Jens

+0

Запишите файл на диск из своего ресурса, затем запустите его. Ниже приведен пример, который поможет вам по пути: http://stackoverflow.com/a/10149824/390421 – MartijnK

+0

Вот как работает вирус. Ожидайте, что обычные контрмеры также будут применяться к вашей программе. –

ответ

3

Скопируйте приложение в папку внутри вашего решения под названием что-то вроде: ресурсов или EmbeddedResources и т.д.

Установите Сложение Действие на «Внедренный ресурс» для этого приложения из проводника решения.

Теперь приложение будет внедрено в ваше приложение во время сборки.

Чтобы получить доступ к нему в поле «Время выполнения», вам необходимо извлечь его в том месте, где вы можете его выполнить.

using (Stream input = thisAssembly.GetManifestResourceStream("Namespace.EmbeddedResources.MyApplication.exe")) 
      { 

       byte[] byteData = StreamToBytes(input); 

      } 


     /// <summary> 
     /// StreamToBytes - Converts a Stream to a byte array. Eg: Get a Stream from a file,url, or open file handle. 
     /// </summary> 
     /// <param name="input">input is the stream we are to return as a byte array</param> 
     /// <returns>byte[] The Array of bytes that represents the contents of the stream</returns> 
     static byte[] StreamToBytes(Stream input) 
     { 

      int capacity = input.CanSeek ? (int)input.Length : 0; //Bitwise operator - If can seek, Capacity becomes Length, else becomes 0. 
      using (MemoryStream output = new MemoryStream(capacity)) //Using the MemoryStream output, with the given capacity. 
      { 
       int readLength; 
       byte[] buffer = new byte[capacity/*4096*/]; //An array of bytes 
       do 
       { 
        readLength = input.Read(buffer, 0, buffer.Length); //Read the memory data, into the buffer 
        output.Write(buffer, 0, readLength); //Write the buffer to the output MemoryStream incrementally. 
       } 
       while (readLength != 0); //Do all this while the readLength is not 0 
       return output.ToArray(); //When finished, return the finished MemoryStream object as an array. 
      } 

     } 

После того, как у Вас есть свои байты [] для применения внутри вашего родительского приложения, вы можете использовать

System.IO.File.WriteAllBytes(); 

сохранить массив байт на жесткий диск с именем файла, который вы хотите.

Для того, чтобы начать свое приложение, для этого вам может понадобиться следующее: Возможно, вы захотите использовать логику, чтобы определить, существует ли там приложение там, и попытайтесь удалить его, если это произойдет. Если он существует, просто запустите его, не сохраняя его.

System.Diagnostics.Process.Start(<FILEPATH HERE>); 

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

  • Нет связанных вопросов^_^