这是一个非常奇怪且特殊的问题:我正在研究Windows服务应用程序,该服务与Visual Studio中的WiX工具集一起安装,使用C#编写。我正在使用的应用程序本质上扩展了在某些事件上从this tutorial;生成的服务的功能,它使用EventLog()
对象记录到事件查看器。我使用的代码与链接教程中的代码基本相同:
public MyService()
{
InitializeComponent();
string eventSourceName = "MyNewLog source";
string logName = "MyNewLog";
eventLog1 = new EventLog();
if (!EventLog.SourceExists(eventSourceName))
{
EventLog.CreateEventSource(eventSourceName, logName);
}
eventLog1.Source = eventSourceName;
eventLog1.Log = logName;
}
我正在使用我用Wix制作的msi
文件安装服务,通常一切正常。如果将变量logName
更改为MyNewLog
以外的其他名称(这是我一直用于测试的名称),则会从msi
中收到以下模糊错误(AAJ是我正在使用的占位符名称)服务):
这并不总是发生;它从昨天开始似乎毫无根据地发生。我曾经能够将logName
设置为任何内容,并且会很高兴地安装,但是现在我不能使用MyNewLog
以外的任何东西。据我检查,当它叫做MyNewLog
时,它可以工作。
我尝试过的事情
我现在尝试使用大约10个不同的名称重命名和重新安装该服务,并且也更改了安装目录。这似乎是独立于我打包到Product.wxs
Wix XML中的参数而发生的。
我还尝试通过将安装程序添加到项目中,然后使用提升的VS命令提示符来调用installutil.exe
来手动安装程序,以安装Windows服务。和以前一样,它会安装,但是如果我尝试启动该服务,则会收到此消息(相同的应用程序,不同的元数据):
看来这是Windows事件日志的问题;无论我对这个问题完全不了解,所以我都不会排除方程式的任何部分。
一些更奇怪的行为:我使用了PowerShell命令Remove-EventLog -LogName "MyNewLog"
,并成功删除了事件日志。然后,我可以使用另一个字符串MyNewLog0
重新安装该程序,尽管该字符串创建了具有该名称的事件日志,但我再也无法使用MyNewLog
来创建该程序了。此外,当设置为MyNewLog0
时,日志记录信息不会显示在此创建的空间中。如果删除MyNewLog0
并替换为MyNewLog
,它将再次起作用。但是,它不仅可以再次使用,而且似乎还包含MyNewLog0
中的日志!
我知道这可能是一个复杂的问题;我希望有一些使用Event Viewer进行开发的经验的人可以帮助诊断此问题。我不知道自己可以使用任何故障排除工具来解决此问题,也不知道如果不全面了解Event Viewer的功能,这是一种有效的学习方法。就是说,即使太难以捉摸,无法利用这些信息进行诊断,但我希望我能在正确的方向上有所帮助。
您在其下运行服务的帐户没有管理员权限(期望的行为)。服务的安装程序应会创建源(由于安装服务需要管理员权限,它可以很好地工作)。
要在Windows Vista和更高版本或Windows Server 2003中创建事件源,您必须具有管理特权。