Шрифт:
Интервал:
Закладка:
public sealed class ProcessStartInfo : object
{
public ProcessStartInfo();
public ProcessStartInfo(string fileName);
public ProcessStartInfo(string fileName, string arguments);
public string Arguments { get; set; }
public bool CreateNoWindow { get; set; }
public StringDictionary EnvironmentVariables { get; }
public bool ErrorDialog { get; set; }
public IntPtr ErrorDialogParentHandle { get; set; }
public string FileName { get; set; }
public bool LoadUserProfile { get; set; }
public SecureString Password { get; set; }
public bool RedirectStandardError { get; set; }
public bool RedirectStandardInput { get; set; }
public bool RedirectStandardOutput { get; set; }
public Encoding StandardErrorEncoding { get; set; }
public Encoding StandardOutputEncoding { get; set; }
public bool UseShellExecute { get; set; }
public string Verb { get; set; }
public string[] Verbs { get; }
public ProcessWindowStyle WindowStyle { get; set; }
public string WorkingDirectory { get; set; }
}
Чтобы опробовать настройку запуска процесса, модифицируйте метод StartAndKillProcess() для загрузки Microsoft Edge и перехода на сайт www.facebook.com с применением ассоциации MsEdge:
static void StartAndKillProcess()
{
Process proc = null;
// Запустить Microsoft Edge и перейти на сайт Facebook
// с развернутым на весь экран окном.
try
{
ProcessStartInfo startInfo = new
ProcessStartInfo("MsEdge", "www.facebook.com");
startInfo.UseShellExecute = true;
proc = Process.Start(startInfo);
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
...
}
В .NET Core свойство UseShellExecute по умолчанию имеет значение false, тогда как в предшествующих версиях .NET его стандартным значением было true. Именно по этой причине показанная ниже предыдущая версия Process.Start() больше не работает без использования ProcessStartInfo и установки свойства UseShellExecute в true:
Process.Start("msedge")
Использование команд операционной системы с классом ProcessStartInfo
Помимо применения ярлыков операционной системы для запуска приложений с классом ProcessStartInfo можно также использовать файловые ассоциации. Если в среде Windows щелкнуть правой кнопкой мыши на имени документа Word, то с помощью контекстного меню можно будет отредактировать или распечатать этот документ. Давайте посредством класса ProcessStartInfo выясним доступные команды и затем применим их для манипулирования процессом. Создайте новый метод со следующим кодом:
static void UseApplicationVerbs()
{
int i = 0;
// Укажите здесь фактический путь и имя документа на своей машине
ProcessStartInfo si =
new ProcessStartInfo(@"..TestPage.docx");
foreach (var verb in si.Verbs)
{
Console.WriteLine($" {i++}. {verb}");
}
si.WindowStyle = ProcessWindowStyle.Maximized;
si.Verb = "Edit";
si.UseShellExecute = true;
Process.Start(si);
}
Первая часть кода выводит все команды, доступные для документа Word:
***** Fun with Processes *****
0. Edit
1. OnenotePrintto
2. Open
3. OpenAsReadOnly
4. Print
5. Printto
6. ViewProtected
После установки WindowStyle в Maximized (т.е. развернутое на весь экран окно) команда (Verb)устанавливается в Edit, что приводит к открытию документа в режиме редактирования. В случае установки команды в Print документ будет отправлен прямо на принтер.
Теперь, когда вы понимаете роль процессов Windows и знаете способы взаимодействия с ними из кода С#, можно переходить к исследованию концепции доменов приложений .NET.
На заметку! Каталог, в котором выполняется приложение, зависит от того, как вы его запускаете. Если вы применяете команду dotnet run, то текущим каталогом будет тот, где располагается файл проекта. Если же вы используете Visual Studio, тогда текущим будет каталог, в котором находится скомпилированная сборка, т.е. .bindebugnet5.0. Вам необходимо должным образом скорректировать путь к документу Word.
Домены приложений .NET
На платформах .NET и .NET Core исполняемые файлы не размещаются прямо внутри процесса Windows, как в случае традиционных неуправляемых приложений. Взамен исполняемый файл .NET и .NET Core попадает в отдельный логический раздел внутри процесса, который называется доменом приложения. Такое дополнительное разделение традиционного процесса Windows обеспечивает несколько преимуществ.
• Домены приложений являются ключевым аспектом нейтральной к операционным системам природы платформы .NET Core, поскольку такое логическое разделение абстрагирует отличия в том, как лежащая в основе операционная система представляет загруженный исполняемый файл.
• Домены приложений оказываются гораздо менее затратными в смысле вычислительных ресурсов и памяти по сравнению с полноценными процессами. Таким образом, среда CoreCLR способна загружать и выгружать домены приложений намного быстрее, чем формальный процесс, и может значительно улучшить масштабируемость серверных приложений.
Отдельный домен приложения полностью изолирован от других доменов приложений внутри процесса. Учитывая такой факт, имейте в виду, что приложение, выполняющееся в одном домене приложения, не может получать данные любого рода (глобальные переменные или статические поля) из другого домена приложения, если только не применяется какой-нибудь протокол распределенного программирования.
На заметку! Поддержка доменов приложений в .NET Core изменилась. В среде .NET Core существует в точности один домен приложения. Создавать новые домены приложений больше нельзя, поскольку это требует поддержки со стороны исполняющей среды и в общем случае сопряжено с высокими накладными расходами. Изоляцию сборок в .NET Core обеспечивает класс ApplicationLoadContext (рассматриваемый далее в главе).
Класс System.AppDomain
С выходом версии .NET Core класс AppDomain считается почти полностью устаревшим. Хотя большая часть оставшейся поддержки предназначена для упрощения перехода из .NET 4.x в .NET Core, она по-прежнему может приносить пользу, как объясняется в последующих двух разделах.
Взаимодействие со стандартным доменом приложения
С помощью статического свойства AppDomain.CurrentDomain можно получать доступ к стандартному домену приложения. При наличии такой точки доступа появляется возможность использования методов и свойств AppDomain для проведения диагностики во время выполнения.
Чтобы научиться взаимодействовать со стандартным доменом приложения, начните с создания нового проекта
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин - Программирование
- Гибкое управление проектами и продуктами - Борис Вольфсон - Программирование
- Каждому проекту своя методология - Алистэр Коуберн - Программирование
- От «Энигмы» до ChatGPT - Рустам Агамалиев - Программирование / Экономика
- Как почистить сканы книг и сделать книгу - IvanStorogev? KpNemo - Программирование