为我的英语道歉,我不是母语人士。
我正在尝试制作Windows服务。如果我尝试构建,安装并运行VS模板,我不会收到任何错误。
我已将我的winform应用程序移植到服务,制作了安装程序,添加了一些数据源,添加了一个webservice的引用,添加了一些类,但是没有向OnStart()和OnStop()添加任何代码。我的代码构建正确,我可以从服务管理器启动和停止服务。
但是,如果我向服务类添加一些代码(我没有在任何地方调用),如果我不向OnStart()和OnStop()添加代码,那么我无法启动服务和错误类似于“服务不响应控制功能”。在事件日志中,我可以看到异常:
System.ArgumentOutOfRangeException
Stack:
in System.String.InternalSubStringWithChecks(Int32, Int32, Boolean)
in System.String.Substring(Int32, Int32)
in UpdaterFIAS.FIASMainClass.getNameFile(System.String, System.String, System.String)
in UpdaterFIAS.FIASMainClass..ctor()
in UpdaterFIAS.Updater..ctor()
in UpdaterFIAS.Program.Main()
我可以在这里看到我的函数getNameFile()
正在抛出异常。但是,我的代码中没有调用它,因为我有空的OnStart()。那么,如果事件日志没有写任何东西(如果它在OnStart()中),我怎么能找到出错的地方?我无法附加调试器,因为它会抛出此异常。
编辑:忘了说,当我使用Windows窗体时我的代码工作正常但是在这里我没有在OnStart中调用任何东西,项目构建没有错误但是我在启动服务时有一个例外。
编辑2: Program.cs代码:
namespace UpdaterFIAS
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Updater()
};
ServiceBase.Run(ServicesToRun);
}
}
}
Updater.cs代码:
namespace UpdaterFIAS
{
public partial class Updater : ServiceBase
{
public Updater()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource("MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
FIASMainClass mainFIAS = new FIASMainClass();
protected override void OnStart(string[] args)
{
//timer1 = new System.Timers.Timer(5000);
//timer1.Elapsed += timer1_Elapsed;
//timer1.AutoReset = false;
//timer1.Enabled = true;
//ServiceStarterThread = new Thread(ServiceStarter);
//ServiceStarterThread.Start();
eventLog1.WriteEntry("In OnStart");
//mainFIAS.Start();
}
protected override void OnStop()
{
//if (updater != null && (updater.ThreadState != System.Threading.ThreadState.Aborted && updater.ThreadState != System.Threading.ThreadState.Stopped)) updater.Abort();
//if (log != null && (log.ThreadState != System.Threading.ThreadState.Aborted && log.ThreadState != System.Threading.ThreadState.Stopped)) log.Abort();
//log.Abort();
//timer1.Enabled = false;
//timer1.Dispose();
eventLog1.WriteEntry("In OnStop");
//mainFIAS.Stop();
}
}
}
编辑3: FIASMainClass.cs代码:
namespace UpdaterFIAS
{
class FIASMainClass
{
public FIASMainClass()
{ }
public void Start()
{
ServiceStarterThread = new Thread(ServiceStarter);
ServiceStarterThread.Start();
}
public void Stop()
{
if (updater != null && (updater.ThreadState != System.Threading.ThreadState.Aborted && updater.ThreadState != System.Threading.ThreadState.Stopped)) updater.Abort();
if (log != null && (log.ThreadState != System.Threading.ThreadState.Aborted && log.ThreadState != System.Threading.ThreadState.Stopped)) log.Abort();
}
private void ServiceStarter()
{
...
}
...
...
...
}
}
答案 0 :(得分:0)
从堆栈跟踪中,输入点为Program.Main
。从那里创建一个新的Updater
并调用getNameFiles
。那将是开始的地方。
调试Windows服务。你是对的,这确实很难。我知道有两个技巧。第一个是在Main(或OnStart)中设置Thread.Sleep
之前做任何事情。这样您就有时间附加调试器了。
另一个技巧是,如果您的Visual Studio与您的服务位于同一台计算机上,请在Main
(或OnStart
)中添加以下行:Debugger.Launch()
。这将告诉服务寻找Visual Studio进行调试会话。有关详细信息,请参阅此处:Debugger.Launch() on windows service in Windows 8