您的位置:首页 > 编程语言 > C#

关于C#下面windows服务读取注册表的问题

2016-01-14 14:19 393 查看
今天,同事跟我讲,写的windows服务读取不了注册表的内容,什么代码没有运行?说什么权限不够,还是什么问题,要帮他看看。

不太习惯在别人的代码下面去检查自己也不太熟的问题,干脆自己重新建个项目,一步步的设置。(新手可以参考c#创建windows服务入门教程实例

一开始我也怀疑是权限的问题,在程序下面设置了UAC的权限为管理员(如何设置,请参考c#通过app.manifest使程序以管理员身份运行

在服务的启动项处,写了一个读取注册表下面某个路径的值,然后写到到服务程序所在路径下面的一个日志文件中。

代码写完了,开始进行运行调试,为了模拟真实的运行环境,直接通过系统下面的程序来运行服务如下

用.net创建的安装Windows服务,可以直接用到一个名为InstallUtil.exe的命令行工具进行安装
安装命令:
installutil 服务名称(程序)
卸载命令:
installutil -u 服务名称(程序)
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727InstallUtil.exe C:\Users\admin\Documents\visual studio 2010\Projects\WSTest\WSTest\bin\Debug\WSTest.exe

启动后,发现服务运行不了,检查后发现,Framework的版本太低了,我用的VS2010,改为这个版本下面的程序来启动

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe C:\Users\admin\Documents\visual studio 2010\Projects\WSTest\WSTest\bin\Debug\WSTest.exe

成功运行服务后,在启动后,触发代码,发现未得到注册表下面的内容,并且出现了异常,提示“未将对象引用设置到对象的实例。”,继续在可能出现错误的位置,加入日志记录的代码,检查发现,OpenSubKey 得到的内容是空的,然后取值就报这个异常。

没办法,继续查资料,发现一篇文章,C# 32位程序与64位程序读\写注册表的区别,讲述了相关的原因,32位的程序在64位机器上面读写注册表的目录是在另一个位置,参考后,发现注册表可以读写成功了。

启动后,发现服务运行不了,检查后发现,Framework的版本太低了,我用的VS2010,改为这个版本下面的程序来启动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: