Tôi đã tạo một ứng dụng bảng điều khiển có menu cho phép tôi điều hướng giữa các mục menu. Tôi xử lý logic điều hướng theo phương pháp này:
cập nhật khoảng trống ảo công khaiMenu()
{
chuyển đổi (Console.ReadKey(true).Key)
{
trường hợp ConsoleKey.UpArrow:
{
nếu (con trỏ > 0)
{
con trỏ--;
Console.Clear();
drawWithHeader();
}
}
phá vỡ;
trường hợp ConsoleKey.DownArrow:
{
if (con trỏ < (menuItemList.Count - 1))
{
con trỏ++;
Console.Clear();
drawWithHeader();
}
}
phá vỡ;
trường hợp ConsoleKey.Escape:
{
nếu (ParentMenu != null)
{
ẩnMenu();
}
}
phá vỡ;
trường hợp ConsoleKey.Enter:
{
Console.Clear();
drawHeader();
Console.CursorVisible = true;
menuItemList[cursor].Action();
Console.CursorVisible = false;
Console.Clear();
drawWithHeader();
}
phá vỡ;
default:
{
// Khóa không được hỗ trợ.
}
phá vỡ;
}
}
đây cả lớp .
Bây giờ trên windows mọi thứ đều hoạt động tốt, nhưng khi tôi sử dụng trên linux của mình hệ thống
Khi chạy ứng dụng này tôi nhận được:
Ngoại lệ chưa được xử lý: System.InvalidOperationException: Không thể đọc khóa khi một trong hai ứng dụng không có bảng điều khiển hoặc khi đầu vào bảng điều khiển đã được chuyển hướng. Hãy thử Console.Read.
Dấu vết ngăn xếp hiển thị:
tại System.ConsolePal.ReadKey(Boolean block)
tại System.Console.ReadKey();
tại AppRazen.Menu.ConsoleMenu.UpdateMenu();
Sau khi tìm kiếm, tôi thấy rằng vấn đề này có liên quan đếnReadKey()
Phương pháp này không hoàn toàn phù hợptương thích với linux .và đề xuất giải phápđâyHoàn toàn không hoạt động trong trường hợp của tôi vì người dùng đã sử dụng OminSharp
.
Tôi cũng đã thử thiết lập ReadKey (sai)
Nhưng điều đó không giải quyết được vấn đề, tôi cũng đã thử sử dụng 处理 Cập nhậtMenu
Mọi thứ trong Console.Read()
Nhưng giao diện điều khiển dường như bị kẹt.
Xin lưu ý rằng sự cố này chỉ xảy ra khi tôi chạy tập lệnh của mình trong trình giám sát linux và không sử dụng những thứ như dotnetAppRazen.dll
Lệnh mặc định như thế này
Về cơ bản, tôi đang sử dụng một cái gì đó như thế này hệ thống
Kịch bản chạy dịch vụ:
[Đơn vị]
Mô tả = Mô tả daemon
[Dịch vụ]
ExecStart = /usr/bin/dotnet /home/root/Desktop/publish/AppRazen.dll
WorkingDirectory= /home/root/Desktop/publish
Khởi động lại=luôn luôn
Khởi động lại giây=3
[Cài đặt]
WantedBy = nhiều người dùng.target
Thực lòng tôi không biết làm thế nào để khắc phục điều này. Có ai có ý tưởng gì không?
Cảm ơn trước.
Câu trả lời ngắn gọn cho việc làm những gì bạn muốn là đơn giản là bạn không thể.
Hãy suy nghĩ về điều này: bạn đang cố gắng tạo một chương trình tương tác (mà người dùng có thể tương tác qua bàn phím). Nhưng bạn cũng biến nó thành một daemon (một daemon chạy ở chế độ nền và không tương tác trực tiếp với người dùng). Đây là hai mục tiêu xung đột nhau.
当 hệ thống
(或 người giám sát
,hoặc người mới nổi
hoặc bất kỳ chương trình dịch vụ hệ thống nào) khi chạy ứng dụng của bạn dưới dạng dịch vụ, nó không cung cấp cách để ứng dụng tương tác với người dùng, vì những ứng dụng này mong đợi là daemon - nghĩa là người dùng không thể tương tác với chúng.
Vì vậy, hãy tự hỏi bản thân xem bạn muốn làm gì: bạn có muốn tạo một chương trình tương tác không? Nếu bạn muốn tạo một chương trình tương tác, bạn không thể chạy nó thông qua người giám sát. vượt qua dotnet/path/to/your.dll
Chỉ cần chạy nó.
Ý kiến khác:
ĐọcKhóa
Có thể có vấn đề, nhưng chắc chắn không phải là trường hợp phổ biến về những gì bạn muốn làm, có vẻ như đó là Linux trên x86_64.
OmniSharp là một plug-in dành cho trình soạn thảo văn bản/IDE giúp đơn giản hóa việc phát triển. Nó cung cấp tính năng tự động hoàn thành và tô sáng cú pháp theo thời gian thực. Nó không liên quan khi chạy ứng dụng.
Làm cách nào để tạo menu điều hướng trong ứng dụng dotnet? Giới thiệu về C# - Làm cách nào để tạo menu điều hướng trong ứng dụng dotnet? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/53300317/
Tôi là một lập trình viên xuất sắc, rất giỏi!