通过java运行.net控制台时"句柄无效"

9 .net c# java console

我正在尝试通过Java运行dot net console应用程序:

process = Runtime.getRuntime().exec(commandLine);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Detecting
The handle is invalid.
Run Code Online (Sandbox Code Playgroud)

当通过控制台(windows)直接运行它时没有问题:

Detecting
100%
Done.
100%
Run Code Online (Sandbox Code Playgroud)

我正在以这种形式运行更多应用程序,但没有问题.

得到了这个堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

问题是当.net应用程序尝试写入控制台时有什么解决方案?

找到导致问题的那一行:

Console.CursorLeft = 0;
Run Code Online (Sandbox Code Playgroud)

你知道为什么吗?

waq*_*qas 11

控制台应用程序正在尝试为控制台设置光标位置.这是不可能的,因为实际上没有控制台.所有不会导致简单读取或写入的操作都可能在没有控制台时导致错误(因为大多数操作都需要控制台输出缓冲区才能工作).

在您想要自动化的控制台应用程序中设置光标位置或清除屏幕等操作是个坏主意.一个基本的解决方法是将违规语句放在try-catch中,并丢弃该异常.从System.Console上MSDN页面:

您不应使用Console类在无人参与的应用程序(如服务器应用程序)中显示输出.同样,对Write和WriteLine等方法的调用对Windows应用程序没有影响.

在将基础流定向到控制台时正常工作的控制台类成员可能会在将流重定向到文件时引发异常.因此,如果重定向标准流,请对应用程序进行编程以捕获System.IO.IOException.


Mar*_*ell 0

如果没有更多细节,很难诊断 - 也许权限......一点异常处理(也许将堆栈跟踪写入 stderr)将有很大帮助。但如果您没有该应用程序,则没有多大帮助。

如果您没有任何进展,您可以尝试使用反射器来查看 .NET 应用程序在“检测”期间正在执行的操作 - 这可能有助于确定原因。