У меня есть сторонняя программа, которую я использую. Ничего другого, что она делает, не существует, поэтому загрузка другой библиотеки или пакета 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, не беспокоясь о пути или убедившись, что я принесу его с собой на конечный компьютер, на котором этот код будет работать все время?
Спасибо. Одна сторона мысли. Есть ли способ создать пакет NuGet, который будет содержать исполняемый файл, или, в этом случае, чтобы он правильно содержал все исполняемые файлы в программе, которую я вызываю, включая сценарии Python, которые он использует, но я этого не делаю для своей части. Просто интересно, будет ли он автоматически загружать его в мой проект и автоматически показывать всякий раз, когда я его компилирую?
Пакет nuget может содержать что угодно, он не обязательно должен содержать код .net, так что да, теоретически вас ничто не остановит.
Обычно сторонний исполняемый файл уже установлен в системе, в противном случае exe-файл включается в вывод.
В первом случае вы можете просто жестко указать путь к Environment.SpecialFolder.ProgramFiles
или Environment.SpecialFolder.ProgramFilesX86
(32 бита) или любой другой путь, который вы выберете.
Компания, в которой я работаю, контролирует все системы, на которых работает наше программное обеспечение, и наша иерархия всегда выглядит следующим образом:
Это упрощает поиск стороннего программного обеспечения.
Другой вариант — просто включить его в сборку, чтобы он выводился в каталог сборки. Вы можете сделать это, щелкнув правой кнопкой мыши свой проект, а затем выполнив «добавить существующий файл», а затем выберите любое расширение во всплывающем окне селектора файлов.
Затем исполняемый файл добавляется как содержимое, и вы можете установить для него значение «копировать, если оно новее» на вкладке свойств:
Файл 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
@JoselineRiker смотрите обновленный ответ. Кроме того, имя Райкер постоянно напоминает мне о звездном пути.
Вы можете просто поместить его в подпапку своего проекта да (вместе с любыми другими файлами, которые ему нужны для работы), а затем убедиться, что он включен в качестве содержимого в вашу сборку. Это предполагает, что ему не нужны какие-либо другие шаги по установке или регистрации, прежде чем его можно будет использовать на новой машине.