2009-03-09 4 views
0

Я включил исполняемый файл в свой проект (т. Е. Когда вы разворачиваете проект в обозревателе решений в VS2008, вы видите его вместе со всеми другими классами). Этот исполняемый файл должен быть запущен моей программой. Как я могу получить его путь программно?Как я могу получить путь к скомпилированному ресурсу?

ответ

3

Я никогда не делал этого раньше с исполняемыми файлами ... Однако, если это встроенный ресурс, вы можете перечислить список встроенных ресурсов в вашем приложении (или обратиться непосредственно к нему по имени), когда вы найдете один подходящий, записать его на диск, а затем выполнить.

Чтобы извлечь:

Assembly assembly = Assembly.GetExecutingAssembly(); 
using (Stream stream = assembly.GetManifestResourceStream("resource name") 
{ 
    using FileStream fs= new FileStream("executable name") 
    { 
    byte[] buffer = new byte[32*1024]; 
    int bytesRead; 
    while ((bytesRead= stream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fs.Write(buffer, 0, bytesRead); 
    } 
    } 
} 

Для выполнения:

using System.Diagnostics; 

Process someProc; 
someProc= Process.Start("executable name"); 

Как Daniel L указывает, не забудьте пометить ресурсы как "внедренный ресурс".

+0

+1 для подачи точно такой же, что и я о том, чтобы:] (Похоже, единственное решение что на самом деле понял вопрос ...) –

+0

Не забудьте пометить exe-файл как em местный ресурс ... –

0

Вот пример получения текста из текстового ресурса:

Assembly assembly = Assembly.GetExecutingAssembly(); 
Stream stream = assembly.GetManifestResourceStream("ResourceTextFileName"); 
StreamReader textStreamReader = new StreamReader(stream); 

Надеюсь, вы можете подобрать, как сделать исполняемым с этим.

-1

Вы можете использовать Assembly класс -

Assembly.GetExecutingAssembly().Location 

должен направить вас к вашей беговой приложения. Используйте этот путь, отмените .EXE и добавьте имя файла вашего исполняемого файла.

string filename = Assembly.GetExecutingAssembly().Location; 
filename = filename.Substring(0, filename.LastIndexOf("\\") + 1); 
filename += "my_exe_name.exe"; 
Process.Start(filename); 

Обратите внимание, что это не будет работать для WebApps, однако, как свойство местоположения может указывать на случайных местах, как GAC.

0

Если вы разворачиваете исполняемый файл вместе с проектом в одну и ту же папку, вы можете использовать класс среды, чтобы получить рабочий каталог исполняемого файла. Это будет: Environment.CurrentDirectory.

Вы можете установить свойство «Скопировать в выходной каталог» исполняемого файла в проводнике решений на «Копировать все» или «Копировать, если новый», чтобы подтвердить это.

0

Это не совсем то, что вы просили, но может быть полезно при использовании одного из предложений других людей выложили:

Имейте в виду, что если ваше приложение является Windows Forms приложение, и он заканчивает установлен в C : \ Program Files ... у вас может не быть права на запись в папку вашего приложения, если пользователь, запускающий приложение, не работает как администратор.

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

Я бы рекомендовал либо:

  1. Не встраивание EXE-файл в качестве ресурса. Просто установите для параметра «Копировать в выходной каталог» значение «Всегда». Затем разверните его вместе со своей основной.exe

  2. Внедрение его в качестве ресурса, но при сохранении его на диске используйте либо временную папку Windows (если это всего лишь одно время), либо папка данных пользователя (C: \ Documents and Settings \ [user] \ Application Data)

Вы можете получить нужную папку для текущей ОС, как это:

// for the Windows temp folder 
Path.GetTempPath() 

// for the user's application data folder 
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) 
Смежные вопросы