サービスとして(を使用して-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、および現在識別されているアカウントを示しています。
サービスが作成した後に、クライアントアプリケーションにメモリマップファイルを表示するにはどうすればよいですか?真のサービスとして実行するのではなく、コンソールサービスとして実行すると機能するのはなぜですか?