単純なウィンドウ サービスを作成していますが、デバッグすると、「ネイティブ フレームがコール スタックの一番上にあるため、式を評価できません。」というエラーが表示されます。また、Release でサービスをビルドして実行すると、ハングします。
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyService1() };
ServiceBase.Run(ServicesToRun);
}
これが Program.cs ファイルのすべてで、通常は ServiceBase.Run(ServicesToRun) 行でハングします。
私が見つけたものはすべて、コードが最適化されているか、asp.net と response.redirect を処理する必要があるため、評価されていない式にのみ関連しています。
サービスのコード。
public TruckRateClearService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
tmrProcess.Enabled = true;
}
protected override void OnCustomCommand(int command)
{
base.OnCustomCommand(command);
if (command == 129)
{
OnStart(null);
}
}
protected override void OnStop()
{
tmrProcess.Enabled = false;
}
private void tmrProcess_Tick(object sender, EventArgs e)
{
tmrProcess.Enabled = false;
try
{
eventLog.WriteEntry("Clearing Truck Rates Start" + DateTime.Now.ToString());
TruckRateClearingAgent.Process();
eventLog.WriteEntry("Clearing Truck Rates Finished" + DateTime.Now.ToString());
}
catch (Exception ex)
{
eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
}
tmrProcess.Enabled = true;
}
internal void Run()
{
tmrProcess_Tick(tmrProcess, null);
}
Internal Void Run() は、Eren Ersönmez によるコメントの提案に基づいて最近追加されました。彼のアイデアは、残りを理解できるようになるまでロジックをデバッグするのに非常に役立ちました。
をネイティブ コール スタックに入れることができました。これは 76F17094 ret という 1 つの場所にあります。これが何なのかはわかりませんが、おそらく他の誰かがそうするでしょう。
また、サービスを開始して VS にアタッチしようとすると、2 つのインスタンスがあることに気付きます。1 つは通常の .exe で、もう 1 つは .vshost.exe です。他のサービスを開始すると、デバッガーの [プロセスにアタッチ] 部分に .exe ファイルしか表示されません。これは、1 つが v4 フレームワーク ( .vshost .exe サービス) にあり、もう 1 つが v2 (単一の .exe サービス) フレームワークにあるためでしょうか?
私はそれがうまくいったと信じています。使用していたタイマーに問題があったようです。私が使用していた元のタイマーは System.Windows.Forms タイマーでした。System.Timers.Timers に切り替えたところ、すべてが再び機能し始めました。まだ VS を接続できませんが、Internal Run() メソッドを使用してデバッグできます。助けてくれてありがとう