0

我已经创建了Windows服务。我使用Windows安装程序进行服务设置。 我有一个XML文件就像一个配置文件。每当我调试Windows服务与附加调试项目,它工作正常。但安装后,我可以看到事件说无法找到C:\ Windows \ system32中的example.xml文件。这是一个重复的问题。任何人都可以告诉我这是怎么回事。或者有什么建议?Windows服务设置后无法检测到XML文件

回答

2

这不是安装程序问题。 Windows服务始终以System32作为当前目录启动。在启动任何服务之前,将此行添加到Program.cs中的Main()方法中。

Environment.CurrentDirectory = new FileInfo(Assembly.GetExecutingAssembly().FullName).DirectoryName; 
+0

+1:可能的方法,我也推荐@ spender's(+ 1)方法来明确计算配置文件的路径,而不是依赖于当前文件夹(即使你设置了它 - 其他一些代码可能会改变它并加载将再次以更混乱的方式被打破)。 – 2013-03-14 20:52:36

+0

我建议这种方法的原因是,如果海​​报不理解这种行为,他可能会有其他依赖下游。 – 2013-03-14 21:04:41

2

最有可能的文件仅仅是不是你正在寻找它。

有可能你的代码在“当前工作文件夹”,这在VS调试过程是一样的应用,但在/起服务的命令行是不同的情况。

确保您的代码加载从你期望的文件是(旁边应用程序即)文件位置,而不是从一些相对路径(如“将myfile.xml”)。

+0

我试过这样做我事件复制xml到安装目录但问题是一样的。有没有办法让安装程序将xml文件复制到system32文件夹? – nzdev 2013-03-14 20:07:39

+1

将XML复制到System32不是最佳实践。在您的服务代码中,您需要使用反射来获取正在运行的程序集的位置。将其转换为目录全名并执行Path.Combine()以获取XML文件的正确位置。 – 2013-03-14 20:17:32

+0

谢谢克里斯托弗...... – nzdev 2013-03-14 21:07:30

-1

的问题是,你的服务没有以管理员身份运行。如果该服务未以管理员身份运行,则无法读取system32文件夹下的文件。

更改服务属性以管理员身份运行。这应该解决这个问题。

+0

这不完全正确。很多system32都可以被非管理员读取。 – 2013-03-14 20:06:27

+0

我的服务已经以管理员身份运行。 – nzdev 2013-03-14 20:08:01

1

你为什么要将东西保存在Windows文件夹中?除非有一个真的很好的理由这样做,这是。在您的应用程序运行的相同位置安装您的配置并获取文件路径:

var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var configPath = Path.Combine(folderPath, configFileName); 
+0

Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly()。Location)); ConfigurationPath = @“config_file.xml”;使用此工作为我感谢...我有你的想法。 – nzdev 2013-03-14 21:06:36

+0

@nzdev,请考虑正式投票的克里斯托弗Painter的解决方案,你基本上使用... – 2013-03-14 21:14:50

+0

你如何做到这一点对我无关紧要。重要的部分是了解Windows服务从System32开始。 – 2013-03-14 21:29:38