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

为什么.NET在安装服务时为服务ImagePath添加额外的引号,.net,service-installer,.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

当.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方法末尾显示的内容:

但下面是该服务的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
这没有帮助

我尽量不用双引号括起来:

 * #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 framework设计中存在这样的概念差距,以至于它不允许使用某种标准方式指定服务启动参数?因此,程序员必须在上下文中对“AssemblyPath”参数使用该技巧

先谢谢你

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

PPS。是的,我知道我可以编写一段代码来打开注册表项并修改ImagePath值,但我希望避免使用这种肮脏的方法,如果可能,我希望使用.NET ServiceInstaller的标准和简单功能来完成所有操作。有可能吗

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

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

考虑到.NET将在ImagePath值周围添加引号,它将成为exe+参数的正确值。正如我所看到的,这个解决方法很好。但我很担心-如果这个在.NET中加了额外引号的错误将来会被修复怎么办?

我怀疑这是一个错误。程序集路径应为文件路径。如果路径包含空格并应视为一个单元(例如在应用程序的参数中),则必须将其括在双引号中。您在这里添加了一个参数,但框架不知道这一点——它将整个字符串视为一个路径,并将其用双引号括起来。真正的问题是:这真的重要吗?服务是否运行正常,或者您是否因为双引号而出现错误。正如您所看到的-我的路径没有任何空格,因此我不明白它为什么要添加引号?而且-是的,当然,当有额外的双引号时,我会得到“error#87.Invalid parameter”,所以这很重要。@dmitry_bond-您的路径确实有空格-因为正如Thorsten所说,它将整个参数视为一条路径,在
exe
TcpGw
之间有空格。