C# 为什么在尝试运行或启动win服务时出错?
我有一个windows服务,无法运行或启动,只能安装或直接调试项目 这是我的主要观点:C# 为什么在尝试运行或启动win服务时出错?,c#,windows-services,C#,Windows Services,我有一个windows服务,无法运行或启动,只能安装或直接调试项目 这是我的主要观点: namespace MyService { public static class Program { private static void Main() { var ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service() };
namespace MyService
{
public static class Program
{
private static void Main()
{
var ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}
}
}
这是我的服务:
public partial class Service : ServiceBase
{
private dynamic _serviceHost;
public Service()
{
this.InitializeComponent();
this.ServiceName = "MyService";
this.CanShutdown = true;
this.CanStop = true;
}
private static string HostName
{
get
{
string hostName = Dns.GetHostName();
IPHostEntry ipHostEntry = Dns.GetHostEntry(hostName);
return ipHostEntry.HostName;
}
}
protected override void OnStart(string[] args)
{
var worker = new Thread(this.InitializeHost) { Name = "Host", IsBackground = false };
worker.Start();
}
private void InitializeHost()
{
var baseAddress = new Uri(string.Format("net.tcp://{0}:{1}/MyService", HostName, "9020"));
var mexAddress = new Uri(string.Format("http://{0}:{1}/MyService", HostName, "8000"));
var cache = Factory.Create<string>("MyAssembly.MyClass", "MyAssembly");
var service = new ServiceWcf<string>(cache);
using (this._serviceHost = new Host<string>(service))
{
this._serviceHost.Open(baseAddress, mexAddress);
}
}
protected override void OnStop()
{
this._serviceHost.Dispose();
}
}
我认为这只是服务注册方式的一个问题——即,它位于错误的位置 从VS命令提示符运行
installutil/u[service]
,卸载您已有的任何服务条目
CD转到要从中运行服务的文件夹-注意这里,您将同时拥有调试版本和发布版本-您希望在服务列表中安装哪一个
在exe上使用installutil/i[service]
重新安装
现在应该可以了
我认为您可能已经首先注册了调试构建,然后在构建发布版本之前在构建上运行了一个干净的操作;从而删除原始可执行文件。或者,或者,您在最初开发项目之后移动了该项目
与我一起工作的许多开发人员使用不同的文件夹来安装本地服务,这些文件夹始终是相同的;然后,他们向其部署调试或发布版本;因此,当他们想要在两者之间切换时,他们只是复制不同的文件版本。我不这样做-我只注册调试版本;但是,在测试发布版本时,我还有更多的工作要做:)我认为这只是服务注册方式的问题,也就是说,它位于错误的位置 从VS命令提示符运行
installutil/u[service]
,卸载您已有的任何服务条目
CD转到要从中运行服务的文件夹-注意这里,您将同时拥有调试版本和发布版本-您希望在服务列表中安装哪一个
在exe上使用installutil/i[service]
重新安装
现在应该可以了
我认为您可能已经首先注册了调试构建,然后在构建发布版本之前在构建上运行了一个干净的操作;从而删除原始可执行文件。或者,或者,您在最初开发项目之后移动了该项目
与我一起工作的许多开发人员使用不同的文件夹来安装本地服务,这些文件夹始终是相同的;然后,他们向其部署调试或发布版本;因此,当他们想要在两者之间切换时,他们只是复制不同的文件版本。我不这样做-我只注册调试版本;但是在测试发布版本时,我还有更多的工作要做:)也许服务注册有问题?你能告诉我们你是如何做到的吗?在“调试”文件夹中的“发布”文件夹中是否缺少一个文件?不,两个输出都是相同的。服务注册有问题吗?你能告诉我们你是如何做到的吗?在“调试”文件夹中的“发布”文件夹中是否缺少一个文件?不,两个输出都是相同的。我已经在服务的两个版本(调试/发布)上运行了installutil/u,并清理了输出版本和重新生成版本。它仍然抛出此错误。@mrt181-请从服务MMC管理单元验证路径是否正确。或者下载psservice()并使用psservice config[service\u name]查询它。对我来说,错误消息是,可执行文件不在它认为的位置。可执行文件的路径是正确的。当我试图手动运行可执行文件时,也会出现错误。@mrt181:好的,如果不是这样的话;那么这一定与服务主机有关。取出打开服务主机的代码(可能只是不打开线程),重新构建并重新部署,然后查看是否发生了相同的情况。如果是,那么它必须仍然是安装路径或类似的路径,因为服务现在没有做任何事情:)我已经在OnStart()中注释了这两行,该方法现在什么也不做。当我尝试运行或启动ExecutableOK时,仍然会出现此错误。我已经在服务的两个版本(调试/发布)上运行了installutil/u,清理了输出版本和重新生成版本。它仍然抛出此错误。@mrt181-请从服务MMC管理单元验证路径是否正确。或者下载psservice()并使用psservice config[service\u name]查询它。对我来说,错误消息是,可执行文件不在它认为的位置。可执行文件的路径是正确的。当我试图手动运行可执行文件时,也会出现错误。@mrt181:好的,如果不是这样的话;那么这一定与服务主机有关。取出打开服务主机的代码(可能只是不打开线程),重新构建并重新部署,然后查看是否发生了相同的情况。如果是,那么它必须仍然是安装路径或类似的路径,因为服务现在没有做任何事情:)我已经在OnStart()中注释了这两行,该方法现在什么也不做。当我尝试运行或启动可执行文件时,仍然会出现此错误
private void InitializeComponent()
{
this.serviceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller = new System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller
//
this.serviceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller.Password = null;
this.serviceProcessInstaller.Username = null;
//
// serviceInstaller
//
this.serviceInstaller.ServiceName = "MyService";
this.serviceInstaller.DisplayName = "My service";
this.serviceInstaller.Description = "My service is awesome.";
this.serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new System.Configuration.Install.Installer[] {
this.serviceProcessInstaller,
this.serviceInstaller});
}