为什么.NET在安装服务时为服务ImagePath添加额外的引号

时间:2016-04-27 08:50:50

标签: .net service-installer

在安装系统服务时,我遇到了非常奇怪的.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 包含此类额外双引号时,我无法启动 service ,因为错误:

System error 87 has occurred.
The parameter is incorrect.

我试图改善这个问题,但没有找到任何解释。

也是一种 rethoric问题 - 为什么在 .NET框架设计中存在这样的概念差距它不允许指定使用某种标准方式服务 StartParameters ?因此,程序员必须在 Context 中使用“AssemblyPath”参数。

提前谢谢。

PS。它是.NET 3.5服务应用程序。 添加服务 StartParameter - 这是由我在代码中完成的。问题不在于添加 StartParameter 本身。问题是 - 为什么.NET框架在那里添加额外的双引号?以及如何避免这种情况?

PPS。是的,我知道我可以编写一段代码来打开注册表项并修改 ImagePath 值,但我想避免使用这样的脏方法,如果可能的话,我想用标准& .NET ServiceInstaller的简单功能。它有可能吗?

解决方法:我实现了一个技巧 - 在 assemblypath 之后添加一个引用,在参数之前添加一个引用,所以现在在 OnBeforeInstall 方法的末尾在日志输出中,我看到以下内容:

 * #1/assemblypath = D:\sandbox\x.NET\bin\Debug\TcpGwSrvc.exe" "TcpGw_7050

有了一个想法,在.NET将在 ImagePath 值周围添加引号后,它将成为正确的exe +参数值。我可以看到这个解决方法工作正常。但是我很难过 - 如果将来修复.NET中有额外引号的这个错误会怎样?

0 个答案:

没有答案