Как включить внешний EXE-файл с моим кодом?

У меня есть сторонняя программа, которую я использую. Ничего другого, что она делает, не существует, поэтому загрузка другой библиотеки или пакета NuGet непосредственно в Visual Studio 2019 невозможна. Никаких DLL для этого или чего-то еще. Он включает в себя exe-файл, который я вызываю с некоторыми параметрами. Делая это с помощью:

System.Diagnostics.Process videoprocess = new System.Diagnostics.Process();  
  System.Diagnostics.ProcessStartInfo videostartInfo = new  
  System.Diagnostics.ProcessStartInfo  
  {  
      WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,  
      FileName = "cmd.exe",  

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

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

ADyson 13.12.2020 19:02

Спасибо. Одна сторона мысли. Есть ли способ создать пакет NuGet, который будет содержать исполняемый файл, или, в этом случае, чтобы он правильно содержал все исполняемые файлы в программе, которую я вызываю, включая сценарии Python, которые он использует, но я этого не делаю для своей части. Просто интересно, будет ли он автоматически загружать его в мой проект и автоматически показывать всякий раз, когда я его компилирую?

Joseline Riker 13.12.2020 19:05

Пакет nuget может содержать что угодно, он не обязательно должен содержать код .net, так что да, теоретически вас ничто не остановит.

ADyson 13.12.2020 19:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно сторонний исполняемый файл уже установлен в системе, в противном случае exe-файл включается в вывод.

В первом случае вы можете просто жестко указать путь к Environment.SpecialFolder.ProgramFiles или Environment.SpecialFolder.ProgramFilesX86 (32 бита) или любой другой путь, который вы выберете.

Компания, в которой я работаю, контролирует все системы, на которых работает наше программное обеспечение, и наша иерархия всегда выглядит следующим образом:

  • Компания
    • Программное обеспечение
      • Приложение
    • Третья сторона
      • Приложение1
      • Приложение2

Это упрощает поиск стороннего программного обеспечения.

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

Затем исполняемый файл добавляется как содержимое, и вы можете установить для него значение «копировать, если оно новее» на вкладке свойств:

Файл csproj будет выглядеть так:

    <Content Include = "HmiLogViewer.exe">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>

Вы также можете попробовать добавить как ссылку, которая добавит файл как ссылку:

    <Content Include = "..\HmiLogViewer\HmiLogViewer\bin\Debug\HmiLogViewer.exe">
      <Link>HmiLogViewer.exe</Link>
    </Content>

Если вы хотите добавить каталог файлов, вы также можете добавить этот фрагмент xml в csproj:

  <ItemGroup>
    <DistributedFilesFolderFiles Include = "..\..\DistributedFiles\**\*.*" />
  </ItemGroup>

  <ItemGroup>
    <None Include = "@(DistributedFilesFolderFiles)">
      <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Visible>True</Visible>
    </None>
  </ItemGroup>

Конечно, отрегулируйте путь (ы) в вашей ситуации.

Редактировать:

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

Мы ищем его автоматически с возможностью переопределить значение из файла настроек (вы можете использовать Environment.GetCommandLineArgs), например, когда нам нужно протестировать обновленную версию стороннего exe или когда путь изменился.

public static string ExecutablePathAndFileName { get; } = Process.GetCurrentProcess().MainModule.FileName;
public static string DataDrive { get; } = Path.GetPathRoot(ExecutablePathAndFileName);
public static string ExecutableFolder { get; } = Path.GetDirectoryName(ExecutablePathAndFileName);

Спасибо, соммен. Это фантастика. Поэтому я собираюсь скопировать его в папку проекта при компиляции. Тем не менее, мне нужно передать папку запуска приложения как часть вызова этого исполняемого файла или он будет автоматически искать там. Как AppDomain.CurrentDomain.BaseDirectory

Joseline Riker 13.12.2020 22:47

@JoselineRiker смотрите обновленный ответ. Кроме того, имя Райкер постоянно напоминает мне о звездном пути.

sommmen 14.12.2020 09:18

Другие вопросы по теме