Как я могу получить путь к скомпилированному ресурсу? - PullRequest
0 голосов
/ 09 марта 2009

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

Ответы [ 5 ]

3 голосов
/ 09 марта 2009

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

Извлечь:

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");

Как указывает Даниэль Л., не забудьте пометить ресурсы как «встроенный ресурс».

0 голосов
/ 09 марта 2009

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

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

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

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

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

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

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

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

// for the user's application data folder
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
0 голосов
/ 09 марта 2009

Вы можете использовать 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);

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

0 голосов
/ 09 марта 2009

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

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

0 голосов
/ 09 марта 2009

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

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

Надеюсь, вы сможете узнать, как сделать исполняемый файл с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...