Я пытаюсь преобразовать существующее приложение 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