4

在安装系统服务时,我遇到了 .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 将来会被修复怎么办?

4

0 回答 0