3

いくつかのファイルを管理するためのWindowsサービスを作成しました。デバッグの目的で、コンソールエントリポイントも作成したので、実際のサービスのすべてのコードは、Windowsサービスとは別のクラスです。設定などを保存するために、流暢なNHibernateを備えたSQLiteDBを使用しています。

コンソールモードを実行すると完全に機能しますが、プロセスを開始しようとすると機能しません。プロセスの開始時にデバッグを実行しましたが、NHibernateがセッションを作成しようとすると、dbファイルが存在していても表示されないことがわかりました。

管理者として実行するようにプロセスを設定し、「」を有効にしてローカルシステムアカウントとして実行しようとしましたAllow access to desktopが、それでもDBファイルを取得できません。これは、NHibernateがファイルをロードできないため、新しいファイルを作成し、サービスがDBからデータをロードしようとすると、空のDBファイルがロードされているため失敗することを意味します。

4

2 に答える 2

2

そのため、特定のフォルダー内のプロセス ファイルが Windows ディレクトリのコンテキストで実行されていたとしても、次のコードを追加したところ、完全に機能するようになりました。

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
于 2013-01-10T07:13:18.247 に答える
1

ファイルのアクセス許可の問題である可能性があります。サービス実行ユーザーがdbファイルを読み書きできることを確認してください。

または、作業ディレクトリの問題である可能性があります: Windows サービスはどのディレクトリで実行されますか?

絶対パスを使用してファイルを見つけることができます。

サービスの開始時に SetCurrentDirectory() を使用して、サービスの実行可能ファイルのパスから抽出したものを渡すことができます。一方、通常、変更されたデータは、サービスのインストール ディレクトリではなく、たとえば ProgramData フォルダーの下にあるべきです。

app.config は通常どおり読み込まれるので、これを使用して、必要に応じてインストールに依存するパスを構成できます。

于 2013-01-08T20:03:59.760 に答える