我正在尝试通过Java运行dot net console应用程序:
process = Runtime.getRuntime().exec(commandLine);
我得到以下输出:
Detecting The handle is invalid.
当通过控制台(windows)直接运行它时没有问题:
Detecting 100% Done. 100%
我正在以这种形式运行更多应用程序,但没有问题.
得到了这个堆栈跟踪:
Detecting at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.get_CursorTop() at AutomaticImageOrientation.HelperClasses.General.WriteProgressToConsole(Int32 lastIndex, Int32 totalImages) at AutomaticImageOrientation.MainManager.DetectImage(String[] files, String outputPath, String& globalErrorMessage, Dictionary`2& foundRotations)
问题是当.net应用程序尝试写入控制台时有什么解决方案?
找到导致问题的那一行:
Console.CursorLeft = 0;
你知道为什么吗?
控制台应用程序正在尝试为控制台设置光标位置.这是不可能的,因为实际上没有控制台.所有不会导致简单读取或写入的操作都可能在没有控制台时导致错误(因为大多数操作都需要控制台输出缓冲区才能工作).
在您想要自动化的控制台应用程序中设置光标位置或清除屏幕等操作是个坏主意.一个基本的解决方法是将违规语句放在try-catch中,并丢弃该异常.从System.Console上的MSDN页面:
您不应使用Console类在无人参与的应用程序(如服务器应用程序)中显示输出.同样,对Write和WriteLine等方法的调用对Windows应用程序没有影响.
在将基础流定向到控制台时正常工作的控制台类成员可能会在将流重定向到文件时引发异常.因此,如果重定向标准流,请对应用程序进行编程以捕获System.IO.IOException.