вы можете использовать разделяемую память для двух процессов, чтобы обмениваться данными, отметив MemoryMappedFile
вы в основном создадите файл отображения памяти mmf
в родительском процессе, используяс помощью оператора using создайте второй процесс до его завершения и позвольте ему записать результат в mmf
, используя BinaryWriter
, затем прочитав результат из mmf
, используя родительский процесс, вы также можете передать mmf
имя, используя аргументы командной строки или его жесткий код.
при использовании сопоставленного файла в родительском процессе убедитесь, что дочерний процесс записывает результат в сопоставленный файл, прежде чем сопоставленный файл будет выпущен в родительском процессе.
Пример: родительский процесс
private static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("memfile", 128))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(512);
}
Console.WriteLine("Starting the child process");
// Command line args are separated by a space
Process p = Process.Start("ChildProcess.exe", "memfile");
Console.WriteLine("Waiting child to die");
p.WaitForExit();
Console.WriteLine("Child died");
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine("Result:" + reader.ReadInt32());
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
Дочерний процесс
private static void Main(string[] args)
{
Console.WriteLine("Child process started");
string mmfName = args[0];
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting(mmfName))
{
int readValue;
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine("child reading: " + (readValue = reader.ReadInt32()));
}
using (MemoryMappedViewStream input = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(input);
writer.Write(readValue * 2);
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
, чтобы использовать этот пример, вам необходимо создать решение с двумя проектами внутри, а затем вывзять результат сборки дочернего процесса из% childDir% / bin / debug и скопировать его в% parentDirectory% / bin / debug, затем запустить родительский проект
childDir
и parentDirectory
являются имена папок ваших проектов на ПК удачи:)