32

VS2008 でビルド/再ビルドを行うたびに ASP.NET 開発サーバー (Cassini) を自動的に停止する方法はありますか? たぶん、どこかに隠された構成設定がありますか?または、少なくともビルド後のイベントとしてそれを行う方法はありますか?

いくつかの背景として、依存性注入などにSpring.NETを使用しているという問題がありますが、アプリケーションの開始時にシングルトンをロードします。つまり、Spring関連のコード/構成を変更すると、開発サーバーを停止する必要があるため、アプリケーション開始イベントが再びトリガーされるように、次のデバッグ/実行を再開します。つまり、コード/構成の束を変更して再度デバッグを開始しても、既に実行されているため、実際には再起動されないため、新しいコードは使用されません。

4

6 に答える 6

9

だから私はマグナスの答えに基づいた回避策に行き着きましたが、次の比較的単純なマクロを使用しています(なぜマクロにVBを使用するように強制するのですか?私はすべて汚いと感じます):

Imports System
Imports System.Diagnostics

Public Module KillCassini

    Sub RestartDebug()
        If (DTE.Debugger.DebuggedProcesses.Count > 0) Then
            DTE.Debugger.Stop(True)
        End If
        KillCassini()
        DTE.Debugger.Go(False)
    End Sub

    Sub KillCassini()
        Dim name As String = "WebDev.WebServer"
        Dim proc As Process
        For Each proc In Process.GetProcesses
            If (proc.ProcessName.StartsWith(name)) Then
                proc.Kill()
            End If
        Next
    End Sub

End Module

基本的に、デバッガーが現在実行中の場合は、デバッガーを停止してから、すべてのカッシーニインスタンスである「WebDev.WebServer」という名前のプロセスを強制終了してから、デバッガーを再起動します(暗黙的にカッシーニを再起動します)。どちらも機能していないか、機能していないように見えたproc.Kill()ため、使用しています...proc.CloseMainWindow()proc.WaitForExit(1000)

とにかく、マクロを取得したら、それをキーボードショートカットに割り当てるか、カスタムツールバーボタンを作成して実行できます。

于 2009-05-21T04:05:26.027 に答える
9

コマンドラインを開くだけです(runas admin)

以下を実行します。それはそれらのすべてを殺す必要があります

Taskkill /IM WebDev.WebServer40.EXE /F
于 2013-04-26T06:28:11.940 に答える
7

私が知っている唯一の方法は、post.buildイベントでカスタムカッシーニ起動を行うことです。このカスタムメイドのプロセスは、カッシーニのすべてのインスタンスを強制終了し、新しいインスタンスを起動します。これを機能させるには、小さなカスタムコマンドラインユーティリティを作成する必要があります。ここではSpawnProcessと呼んでいます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Diagnostics;

namespace SpawnProc
{
  class Program
  {
    public static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        // Kill all current instances
        FileInfo fi = new FileInfo(args[0]);
        string name = Path.GetFileNameWithoutExtension(fi.FullName);
        foreach (Process proc in Process.GetProcessesByName(name))
        {
          proc.Kill();
        }

        ProcessStartInfo startInfo = new ProcessStartInfo(args[0]);
        if (args.Length > 1)
        {
          startInfo.Arguments += "/port:" + args[1];
        }

        if (args.Length > 2)
        {
          startInfo.Arguments += " /path:\"" + args[2].Trim(new char[]{'"'}) + "\"";
        }
        if (args.Length > 3)
        {
          startInfo.Arguments += " /vpath:\"" + args[3].Trim(new char[]{'"'}) + "\"";
        }

        try
        {
          Process.Start(startInfo);
        }
        catch (Exception ex)
        {
          Debug.WriteLine("Error: " + ex.Message);
          for (int i = 0; i < args.Length; i++)
          {
            Debug.WriteLine("args[" + i + "]: " + args[i].ToString());
          }
        }
      }
    }
  }
}

次に、カッシーニを使用しないようにVisualStudioに指示します。Webアプリケーションのプロパティ->Webに移動し、[カスタムWebサーバーを使用する]を選択して、次のように入力しますhttp://localhost:1685/(または使用するポート番号)。次に、ビルド後のイベントに次のコマンドを入力します。

"$(ProjectDir)..\SpawnProc\bin\debug\SpawnProc" "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe" 1685 "$(ProjectDir)" /

パスが正しいことを確認してください。たとえば、64ビットOSを実行しているため、プログラムファイルのパスが32ビットOSとは異なります。また、私のSpawnProc.exeはサブプロジェクトにあります。

于 2009-05-20T13:19:05.557 に答える
5

この投稿とコードのクリーンアップに関する別の投稿に触発されて 、マクロを PostDebug-event として追加しました。したがって、デバッガーが戻るたびに、すべての WebDev.WebServer-s が削除されます。(そして、ProcessName 制約を緩和しました。)

注: これにより、おそらくすべての WebServer が強制終了されるため、他のデバッグ セッションの WebServer も強制終了されます (現時点では問題ありませんが、通常は何もありません)。したがって、子プロセスまたはそのようなもののみを探したい場合があります(そしてそのコードをここに投稿してください ;-) )。

したがって、私のコードは次のようになります。

Private Sub DebuggerEvents_OnEnterDesignMode(ByVal Reason As EnvDTE.dbgEventReason) _
            Handles DebuggerEvents.OnEnterDesignMode
    If (Reason = dbgEventReason.dbgEventReasonStopDebugging) Then
        Dim name As String = "WebDev.WebServer"
        Dim proc As System.Diagnostics.Process
        For Each proc In System.Diagnostics.Process.GetProcesses()
            If (proc.ProcessName.StartsWith(name)) Then
                proc.Kill()
            End If
        Next
    End If
End Sub
于 2011-01-21T16:09:56.743 に答える
0

別の方法は、Powershell を使用することです。

PS: 誰かがまだ必要としているかどうかはわかりませんが、まったく別のものを探しているときに、偶然このソリューションに出くわしました。

于 2014-03-28T17:00:50.727 に答える