Создание общих переменных в памяти для дочернего процесса в родительский C # - PullRequest
0 голосов
/ 05 октября 2018

Я программирую местную потоковую службу.И мне нужно использовать два разных процесса для серверного программного обеспечения (не спрашивайте, почему она).Процесс "child" делает тяжелую работу, и мне нужно получить результаты, но рабочий процесс выполняется в миллисекундах (потому что это сервис потоковых видеоигр).Я пытался с: Process.OutputDataReceived EventHandler, но результаты много текста, и Консоль занимает много времени для записи.

Также я пытался с FileStream ,Но по логике и исследованиям я знал, что использование MemoryStream быстрее для хранения и получения данных.Проблема в том, что я не знаю, как получить данные, которые сохраняет процесс child .

Следующий код неплох, но он просто сообщает им, что ятакже попробуйте использовать этот код:

Родительский процесс:

public class MemoryRead
{
    Process process = null;
    int bufferSize = 256000;

    public MemoryRead(Process Process, int BufferSize){
        process = Process;
        bufferSize = BufferSize;
    }

    const int PROCESS_WM_READ = 0x0010;

    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll")]
    public static extern bool ReadProcessMemory(int hProcess,
      int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

    public string GetString(int BytesAdress = 0x0046A3B8)
    {
        IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
        int bytesRead = 0;
        byte[] buffer = new byte[bufferSize];
        ReadProcessMemory((int)processHandle, BytesAdress, buffer, buffer.Length, ref bytesRead);

        return Encoding.UTF8.GetString(buffer);
    }

}

Дочерний процесс:

GCHandle handler = GCHandle.Alloc(VideoData, GCHandleType.Pinned);
IntPtr address = handler.AddrOfPinnedObject();
Console.WriteLine((address.ToString()));

Дочерний процесс возвращает int «адрес», и я получаю это с помощью Process.OutputDataReceived EventHandler для вызова MemoryRead.GetString(), но это возвращает ноль, в основном, как если бы адрес не существовал.Я просто хочу больше опций, даже если они не имеют ничего общего с MemoryStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...