2009-09-08 2 views
1

У меня есть приложение .NET Windows, которому необходимо вызвать другой исполняемый файл .NET. Я хочу распространять этот другой exe как часть основного проекта, и задавался вопросом, что является лучшим способом реализации этого. Мы не хотим брать код из этого второго exe и помещать его в основной проект, так как нам нужно, чтобы exe эффективно оставался запечатанным, так как мы также распространяем его на сторонние.Как я могу назвать .NET exe, который распространяется вместе с моим основным приложением

Вариантов рассматриваются:

  1. Должен ли я добавить ех в виде файла в рамках проекта и установить копию на выход как «Копировать всегда», а затем просто запустить его из основной папки приложения?
  2. Следует ли добавить exe в качестве ссылки в основной проект? Если я это сделаю, как бы тогда назвать его исполняемым с параметрами?

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

Спасибо!

+0

Вы говорите о запуске в режиме разработки (т. Е. Из Visual Studio), или вы говорите о том, как только он развернут? Из формулировки вашего вопроса не совсем ясно. –

+0

Мне нужно запустить его после его развертывания. – JamesW

ответ

5

Есть два способа выполнения кода в исполняемый файл:

  • как отдельный процесс: используйте System.Diagnostics.Process и передавать в какой-либо информации в качестве аргументов командной строки
  • в том же самом процессе, с помощью обычного метода .NET вызывает
  • в том же процессе в отдельном AppDomain

Оба эти горе rk штраф; в первой версии вам не понадобится ваш основной проект для ссылки на exe вообще: просто включите его в свой проект установки/развертывания, если он у вас есть. Если вы используете xcopy-развертывание (т. Е. Просто занимаете содержимое выходного каталога), вы можете добавить ссылку на exe только для того, чтобы скопировать его.

Чтобы использовать вторую форму, вам необходимо добавить ссылку на exe-файл в вашем проекте. Если вы счастливы назвать код в процессе, это, скорее всего, будет самым простым решением.

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

+0

Спасибо, Джон. Очень полный и полезный ответ! – JamesW

+0

@Jon: Первое утверждение («два разных способа») конфликтует с фактическим количеством способов, которые вы указали. –

0

Вы также можете сделать это как сборку Dll и вызвать его из своего приложения, я имел в виду загрузку сборки во время выполнения, если она существует.

+1

Вам не нужно делать это DLL, чтобы использовать его в качестве ссылки. –

0

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

2

Копирование на вывод - это, конечно же, самое простое решение.

Если вы не хотите, чтобы этот exe висел вместе с вашими файлами приложений, поместите его в ресурсы и когда вашему приложению нужно запустить этот exe, просто сохраните его в папку temp и запустите оттуда.

Вот доказательство правильности концепции код:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fileName = Path.ChangeExtension(Path.GetTempFileName(), "exe"); 
     File.WriteAllBytes(fileName, Resources.QueryExpress); 
     var queryAnalyzer = Process.Start(fileName); 
     queryAnalyzer.WaitForExit(); 
    } 
} 

В свойствах проекта перейдите к ресурсам и перетаскивания там ваш исполняемый файл. Этот образец использует приложение с именем QueryExpress.exe.

Возможно, вы захотите сжать свое приложение в ZIP-файл, чтобы уменьшить его. Это добавит еще один шаг для распаковки архива перед запуском процесса.

+0

+1 Это лучший вариант, если важно, чтобы конечным пользователям было сложно запускать (или даже знать) второй исполняемый файл. Варианты, упомянутые в ответе Джона, не достигают этого. – Ash