我已经创建了一个 Windows服务来为我管理一些文件。出于调试目的,我还编写了一个控制台入口点,因此实际服务的所有代码都是一个与Windows服务不同的类。我使用 SQLite 数据库和流畅的 NHibernate 来存储设置等。
当我运行控制台模式时,它运行正常,但是当尝试启动该过程时却没有。我已经在我的进程启动时进行了调试,发现当NHibernate尝试创建会话时,即使它确实存在,也无法看到db文件。
我已将该过程设置为以管理员身份运行,并且还尝试将其作为启用了“Allow access to desktop
”的本地系统帐户运行,但它仍然无法获取数据库文件。这意味着 NHibernate 无法加载文件,因此它会创建一个新文件,当我的服务尝试从数据库加载数据时,它会失败,因为它加载了空白的DB文件。
答案 0 :(得分:1)
这可能是文件权限问题。检查服务执行用户是否可以读/写db文件。
或者,它可能是一个工作目录问题: What directory does a Windows Service run in?
您可以使用绝对路径查找文件。
您可以在启动服务时尽早使用SetCurrentDirectory(),并将其从服务可执行文件的路径中提取。另一方面,通常修改的数据不应该在服务的安装目录中,而是例如而是在ProgramData文件夹下。
app.config仍然照常加载,因此可以根据需要使用它来配置任何依赖于安装的路径。
答案 1 :(得分:1)
事实证明,即使我的进程文件在特定文件夹中,它在Windows目录的上下文中运行,我已经添加了以下代码,现在它完美地运行:
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);