Tôi đã xây dựng một ứng dụng cũng có thể được chạy như một dịch vụ (sử dụng một -service
chuyển đổi). Điều này hoạt động hoàn hảo không có vấn đề gì khi tôi chạy dịch vụ từ dấu nhắc lệnh (Tôi có một cái gì đó được thiết lập cho phép tôi gỡ lỗi nó từ bảng điều khiển khi không được chạy như một dịch vụ thực sự). Tuy nhiên, khi tôi cố chạy nó như một dịch vụ thực sự thì sử dụng ứng dụng của mình để mở bản đồ bộ nhớ hiện có, tôi gặp lỗi ...
Không thể tìm thấy tập tin được chỉ định.
Cách tôi chạy nó như một dịch vụ hoặc trong bảng điều khiển:
[STAThread]
static void Main(string[] args)
{
//Convert all arguments to lower
args = Array.ConvertAll(args, e => e.ToLower());
//Create the container object for the settings to be stored
Settings.Bag = new SettingsBag();
//Check if we want to run this as a service
bool runAsService = args.Contains("-service");
//Check if debugging
bool debug = Environment.UserInteractive;
//Catch all unhandled exceptions as well
if (!debug || debug)
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
if (runAsService)
{
//Create service array
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new CRSService()
};
//Run services in interactive mode if needed
if (debug)
RunInteractive(ServicesToRun);
else
ServiceBase.Run(ServicesToRun);
}
else
{
//Start the main gui
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainGUI());
}
}
Trong ứng dụng của tôi, tôi có một bên dịch vụ và một bên ứng dụng. Mục đích của ứng dụng chỉ là kiểm soát dịch vụ. Tôi thực hiện tất cả các điều khiển bằng các tệp ánh xạ bộ nhớ và nó có vẻ hoạt động tốt và phù hợp với nhu cầu của tôi. Tuy nhiên, khi tôi chạy ứng dụng như một dịch vụ thực sự, tôi thấy từ nhật ký gỡ lỗi của mình, nó đang tạo tệp bản đồ bộ nhớ với tên và cài đặt truy cập chính xác. Tôi cũng có thể thấy tập tin được tạo ở nơi cần có. Mọi thứ dường như hoạt động chính xác như nhau trong dịch vụ giống như khi tôi gỡ lỗi thông qua bảng điều khiển. Tuy nhiên, ứng dụng của tôi (khi được chạy dưới dạng ứng dụng thay vì dịch vụ) cho tôi biết nó không thể tìm thấy tệp bản đồ bộ nhớ. Tôi cũng bị lỗi đường dẫn tên tệp vì vậy tôi biết nó đang tìm đúng chỗ.
Cách tôi mở bản đồ bộ nhớ (lỗi được ném):
m_mmf = MemoryMappedFile.OpenExisting(
m_sMapName,
MemoryMappedFileRights.ReadWrite
);
Lưu ý: Dịch vụ này đang chạy cùng một tài khoản với tôi chạy Visual Studio. Ví dụ như hình ảnh bên dưới hiển thị trình quản lý tác vụ của tôi, dịch vụ.msc gui và tài khoản hiện được xác định của tôi.
Làm cách nào tôi có thể nhận ứng dụng khách của mình để xem tệp bản đồ bộ nhớ sau khi dịch vụ tạo nó? Tại sao nó hoạt động khi tôi chạy nó như một dịch vụ điều khiển mà không phải khi tôi chạy nó như một dịch vụ thực sự?