Используйте Process.StandardInput с Mono - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь преобразовать существующее приложение Windows Form для запуска на Mac с использованием Mono.По большей части все приложение работает, как и ожидалось, за одним исключением.Часть приложения использует Graphviz для вывода и генерации PDF, который прекрасно работает в Windows.Однако, когда я запускаю Mono на моем Mac, я получаю «System.IO.IOException: ошибка записи по пути / Users / Kevin / Desktop / TitleChain / [Unknown]» (полная трассировка стека ниже).Я считаю, что это связано с тем фактом, что Mono запускает процесс, и он немедленно завершает работу, прежде чем я смогу выполнить процесс. StandardInput.WriteLine для отправки текста файла точек.Не уверен, что есть что-то, что я могу включить в ProcessStartInfo, чтобы предотвратить преждевременный выход из процесса.Может быть, что-то с помощью ProcessStartInfo.RedirectStandardInput / Output?

Код не имеет проблем с поиском исполняемого файла dot.exe Graphviz, и я уже преодолел проблемы с разрешениями.Все указывает на то, что Mono не осознает, что процесс должен оставаться открытым, пока я обрабатываю StandardInput и StandardOutput.

Чтобы отдать должное кредиту, этот код был первоначально адаптирован из graphvizwrapper: https://github.com/JamieDixon/GraphViz-C-Sharp-Wrapper

        var processStartInfo = this.GetProcessStartInfo(fileType);
        if (masterForm.IsRunningOnMono() || debugMode)
        {
            Console.WriteLine("Running Mono, using alternative process methodology");                

            var process = Process.Start(processStartInfo);
            process.StandardInput.WriteLine(dotFile);
            var baseStream = process.StandardOutput.BaseStream;

            output = this.ReadFully(baseStream);
        }

Используемые функции:

    private System.Diagnostics.ProcessStartInfo GetProcessStartInfo(string returnType)
    {
        return this.getProcessStartInfoQuery.Invoke(new ProcessStartInfoWrapper
        {
            FileName = this.FilePath,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
            Arguments = "-v -o -Tpdf",
            CreateNoWindow = true
        });
    }

    private byte[] ReadFully(Stream input)
    {
        using (var ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }

Класс GetStartProcessQuery:

    public Process Invoke(ProcessStartInfo processStartInfo)
    {
        return Process.Start(processStartInfo);
    }

Единственная другая важная информация, которую я могу представить, заключается в том, что исходное приложение находится в и выполняется изпапка TitleChain и файл graphviz dot.exe находятся в подкаталоге с именем graphviz.

Заранее благодарим за помощь.

Трассировка стека:

System.IO.IOException: Write fault on path /Users/Kevin/Desktop/TitleChain/[Unknown]

at System.IO.FileStream.WriteInternal (System.Byte[] src, System.Int32 offset, System.Int32 count) [0x00077] in <bb7b695b8c6246b3ac1646577aea7650>:0 

at System.IO.FileStream.Write (System.Byte[] array, System.Int32 offset, System.Int32 count) [0x00090] in <bb7b695b8c6246b3ac1646577aea7650>:0 

at System.IO.StreamWriter.Flush (System.Boolean flushStream, System.Boolean flushEncoder) [0x0007e] in <bb7b695b8c6246b3ac1646577aea7650>:0 

at System.IO.StreamWriter.Write (System.Char[] buffer, System.Int32 index, System.Int32 count) [0x000d3] in <bb7b695b8c6246b3ac1646577aea7650>:0 

at System.IO.TextWriter.WriteLine (System.String value) [0x00070] in <bb7b695b8c6246b3ac1646577aea7650>:0 

at TitleChainApplication.GraphVizWrapper.GraphGeneration.GenerateGraph (System.String dotFile, TitleChainApplication.Enums+GraphReturnType returnType) [0x00103] in <5bfb1715358f4c24a3905e8d8ae55245>:0 

at TitleChainApplication.Form1.ExportTree (TitleChainApplication.Enums+GraphReturnType fileType) [0x00034] in <5bfb1715358f4c24a3905e8d8ae55245>:0 

at TitleChainApplication.Form1.ExportPDF () [0x00001] in <5bfb1715358f4c24a3905e8d8ae55245>:0 

at TitleChainApplication.Form1.pDFToolStripMenuItem_Click (System.Object sender, System.EventArgs e) [0x00001] in <5bfb1715358f4c24a3905e8d8ae55245>:0 

at TitleChainApplication.Form1.Export_ButtonClick (System.Object sender, System.EventArgs e) [0x00001] in <5bfb1715358f4c24a3905e8d8ae55245>:0 

at System.Windows.Forms.ToolStripSplitButton.OnButtonClick (System.EventArgs e) [0x00019] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.ToolStripSplitButton.HandleClick (System.Int32 mouse_clicks, System.EventArgs e) [0x00028] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.ToolStripItem.FireEvent (System.EventArgs e, System.Windows.Forms.ToolStripItemEventType met) [0x00054] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at (wrapper remoting-invoke-with-check) System.Windows.Forms.ToolStripItem.FireEvent(System.EventArgs,System.Windows.Forms.ToolStripItemEventType)

at System.Windows.Forms.ToolStrip.OnMouseUp (System.Windows.Forms.MouseEventArgs mea) [0x00048] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.Control.WmLButtonUp (System.Windows.Forms.Message& m) [0x00078] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message& m) [0x001b4] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.ScrollableControl.WndProc (System.Windows.Forms.Message& m) [0x00000] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.ToolStrip.WndProc (System.Windows.Forms.Message& m) [0x00000] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.Control+ControlWindowTarget.OnMessage (System.Windows.Forms.Message& m) [0x00000] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.Control+ControlNativeWindow.WndProc (System.Windows.Forms.Message& m) [0x0000b] in <84cef96c1ef54299a622b3e52fada5d0>:0 

at System.Windows.Forms.NativeWindow.WndProc (System.IntPtr hWnd, System.Windows.Forms.Msg msg, System.IntPtr wParam, System.IntPtr lParam) [0x00085] in <84cef96c1ef54299a622b3e52fada5d0>:0
...