2008-11-29 14 views
8

Tôi đang cố gắng để chạy dot net ứng dụng giao diện điều khiển thông qua Java:"Việc xử lý không hợp lệ" khi chạy .net console qua java

process = Runtime.getRuntime().exec(commandLine); 

tôi nhận được kết quả như sau:

Detecting 
The handle is invalid. 

khi chạy nó trực tiếp thông qua giao diện điều khiển (windows) không có vấn đề:

Detecting 
100% 
Done. 
100% 

Tôi đang chạy nhiều ứng dụng hơn trong biểu mẫu này nhưng không có vấn đề gì .

Got chồng này dấu vết:

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) 

Vấn đề là khi ứng dụng .net cố gắng viết ra cửa sổ Console giải pháp là gì?

tìm thấy dòng gây ra vấn đề:

Console.CursorLeft = 0; 

Bạn có biết tại sao?

Trả lời

0

Khó chẩn đoán mà không cần chi tiết hơn - có lẽ quyền ... một chút xử lý ngoại lệ (có thể viết stack-dấu vết để stderr) sẽ giúp rất nhiều. nhưng không có nhiều trợ giúp nếu bạn không sở hữu ứng dụng.

Nếu bạn không nhận được bất cứ nơi nào, bạn có thể thử sử dụng reflector để xem ứng dụng .NET đang làm gì trong quá trình "Phát hiện" - nó có thể giúp xác định nguyên nhân.

+1

Tôi tìm thấy dòng: Console.CursorLeft = 0; bạn có lý do tại sao nó gây ra vấn đề? (chỉ khi chạy nó qua Java) –

+0

@Shaul - có thể nó liên quan đến chuyển hướng luồng? tức là nó không thể tìm thấy bộ đệm IO gốc? Freaky ... không chắc chắn sẽ giúp bạn nhiều ... –

0

Tôi không nghĩ rằng có sự cố với chương trình của bạn bè bạn. Bạn có thể cần lấy dòng đầu ra của đối tượng quy trình mà bạn nhận được từ Runtime.getRuntime(). Exec (commandLine) và gọi phương thức read() hoặc một cái gì đó. Có thể đấy.

10

Ứng dụng bảng điều khiển đang cố đặt vị trí con trỏ cho bảng điều khiển. Điều này là không thể, vì thực tế không có bàn điều khiển. Tất cả các hoạt động mà không dẫn đến việc đọc hoặc ghi đơn giản có thể gây ra lỗi khi không có bàn điều khiển (vì hầu hết chúng yêu cầu bộ đệm đầu ra của bàn điều khiển để hoạt động).

Bạn nên làm những việc như đặt vị trí con trỏ hoặc xóa màn hình trong ứng dụng bảng điều khiển mà bạn muốn tự động hóa. Cách giải quyết cơ bản là chỉ cần đặt tuyên bố vi phạm trong một lần thử, và loại bỏ ngoại lệ. Từ MSDN page on System.Console:

Bạn không nên sử dụng lớp điều khiển để hiển thị đầu ra trong các ứng dụng không cần giám sát, chẳng hạn như máy chủ ứng dụng. Tương tự, các cuộc gọi tới các phương thức như Write và WriteLine không có hiệu lực trong các ứng dụng Windows . thành viên

Bảng điều khiển lớp mà làm việc bình thường khi dòng cơ bản là hướng đến một giao diện điều khiển có thể ném một ngoại lệ nếu dòng được chuyển hướng, ví dụ, vào một tập tin. Do đó, lập trình ứng dụng của bạn để bắt được System.IO.IOException nếu bạn chuyển hướng luồng tiêu chuẩn.

+1

Tại sao không có giao diện điều khiển khi nó được tự động? Có cách nào để kiểm tra theo chương trình (ngoại trừ với ngoại lệ) liệu cửa sổ bảng điều khiển có tồn tại không? – xr280xr

+1

@ xr280xr Cập nhật câu trả lời với trích dẫn và tham khảo MSDN. Bắt ngoại lệ là cách bạn có thể phát hiện nó trong một ứng dụng .NET. Hoặc bạn có thể gọi hàm API Windows C GetConsoleWindow(), được ghi lại ở đây: http://msdn.microsoft.com/en-us/library/ms683175(v=vs.85).aspx – waqas

0

Hãy thử điều này để có được những dòng đầu ra của lệnh gọi

Runtime r = Runtime.getRuntime(); 
mStartProcess = r.exec(applicationName, null, fileToExecute); 

StreamLogger outputGobbler = new StreamLogger(mStartProcess.getInputStream()); 
outputGobbler.start(); 

int returnCode = mStartProcess.waitFor(); 


class StreamLogger extends Thread{ 

    private InputStream mInputStream; 

    public StreamLogger(InputStream is) { 
     this.mInputStream = is; 
    } 

    public void run() { 
     try { 
      InputStreamReader isr = new InputStreamReader(mInputStream); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
        System.out.println(line); 
      } 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 

} 
0

Điều đó có thể phụ thuộc vào cách ứng dụng Java của bạn đang được chạy. Nếu ứng dụng java của bạn không có giao diện điều khiển, khi có thể có vấn đề khi sự hiện diện của bàn điều khiển là cần thiết cho quá trình bên trong của bạn. Đọc this.

0

Tôi chạy vào cùng một vấn đề, chỉ có nó chạy từ một ứng dụng giao diện điều khiển C# thông qua bộ lập lịch tác vụ SQL.

Tôi tin rằng vấn đề là một số phương thức giao diện điều khiển và thuộc tính (Console.WindowWidth, Console.CursorLeft) đang cố gắng thao tác đầu ra bàn điều khiển, điều này không thể thực hiện khi bàn điều khiển được chuyển hướng.

Tôi đã bao bọc phần mã trong khối thử đơn giản, và nó hoạt động tốt ngay bây giờ.

//This causes the output to update on the same line, rather than "spamming" the output down the screen. 
//This is not compatible with redirected output, so try/catch is needed. 
try 
{ 
    int lineLength = Console.WindowWidth - 1; 
    if (message.Length > lineLength) 
    { 
     message = message.Substring(0, lineLength); 
    } 

    Console.CursorLeft = 0; 
    Console.Write(message); 
} 
catch 
{ 
    Console.WriteLine(message); 
} 
Các vấn đề liên quan