我建立了一个应用程序,它也可以作为服务运行(使用-service
开关)。当我从命令提示符运行服务时(我设置了一些内容,让我在不作为真正的服务运行时可以从控制台调试它),这个功能完美地工作,没有任何问题。然而,当我尝试将其作为真正的服务运行并使用我的应用程序打开现有的内存映射时,会出现以下错误...
无法找到指定的文件。
如何将其作为服务或在控制台中运行:
[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());
}
}
在我的应用程序中,我有一个服务端和一个应用端。应用的目的仅仅是控制服务端。我使用内存映射文件来进行所有的控制,这似乎非常好,并且符合我的需求。但是当我将应用作为真正的服务运行时,从我的调试日志中我发现它正在使用正确的名称和访问设置创建内存映射文件。我也能看到文件被创建在了正确的位置。一切似乎在服务中与通过控制台进行调试时完全相同。然而,当我将应用程序作为应用程序而不是服务运行时,它告诉我找不到内存映射文件。我让它在错误中输出文件名路径,所以我知道它正在寻找正确的地方。
我如何打开内存映射文件(出现错误的地方):
m_mmf = MemoryMappedFile.OpenExisting(
m_sMapName,
MemoryMappedFileRights.ReadWrite
);
注意:该服务运行于与我在Visual Studio中运行的相同账户。例如,下面的图片展示了我的任务管理器、services.msc界面和当前识别的账户。
当服务创建内存映射文件后,如何让客户端应用程序能够看到它?为什么我将其作为控制台服务运行时可以工作,但是将其作为真正的服务运行时却无法工作?
注:原文中的“gui”是Graphical User Interface的缩写,即“图形用户界面”。
myappsvr_mm_toggles
。我不确定为什么它需要“跨会话可见”。它实际上是类中硬编码的值,两个实例都会得到。 - Arvo Bowen