在安装系统服务时,我遇到了 .NET 非常奇怪的行为。
我在OnBeforeInstall方法中添加了 2 个日志记录调用。这是它在输入方法时显示的内容:
+ PreparingInstallation: 4 items in Parameters:
* #0/name = TcpGw_7050
* #1/assemblypath = D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe
* #2/logfile = C:\Users\Dmitry\AppData\Local\Temp\install-TcpGw_7050.log
* #3/logtoconsole =
这是它在OnBeforeInstall方法末尾显示的内容:
+ ReadyToInstall: 4 items in Parameters:
* #0/name = TcpGw_7050
* #1/assemblypath = "D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe" TcpGw_7050
* #2/logfile = C:\Users\Dmitry\AppData\Local\Temp\install-TcpGw_7050.log
* #3/logtoconsole =
但这是为该服务的ImagePath属性真正安装的内容:
""D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe" TcpGw_7050"
因此,由于未知原因,它被包含在额外的双引号中!但为什么?以及如何解决这个问题?
我已经尝试用双引号将参数括起来:
* #1/assemblypath = "D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe" "TcpGw_7050"
那没有帮助。
我试图不用双引号括起来任何东西:
* #1/assemblypath = D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe TcpGw_7050
那也没有帮助。
为什么它很重要:因为当ImagePath包含这样额外的双引号时,我无法启动服务,因为错误:
System error 87 has occurred.
The parameter is incorrect.
我试图解决这个问题,但没有找到任何解释。
也是一个值得思考的问题- 为什么.NET 框架设计中存在这样的概念差距,它不允许使用某种标准方式指定服务StartParameters ?因此,程序员必须在Context中使用带有“AssemblyPath”参数的技巧。
先感谢您。
PS。它是 .NET 3.5 服务应用程序。添加服务StartParameter - 这是由我在代码中完成的。问题不在于添加StartParameter本身。问题是 - 为什么 .NET 框架在那里添加额外的双引号?以及如何避免这种情况?
聚苯乙烯。是的,我知道我可以编写一段代码来打开注册表项并修改ImagePath值,但我想避免使用这种肮脏的方法,如果可能的话,我想用 .NET 的标准和简单功能来做所有事情服务安装程序。有可能吗?
解决方法:我实现了一个技巧 - 在assemblypath之后添加一个引号,在参数之前添加一个引号,所以现在在日志输出中OnBeforeInstall方法的末尾,我看到以下内容:
* #1/assemblypath = D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe" "TcpGw_7050
考虑到 .NET 将在此类ImagePath值周围添加引号后,它将成为exe + parameters 的正确值。正如我所看到的,这种解决方法效果很好。但我很担心——如果这个在 .NET 中带有额外引号的 bug 将来会被修复怎么办?