VS2008でビルド/再ビルドを実行するたびにASP.NET開発サーバー(Cassini)を自動的に停止する方法はありますか(そして、必要なときに明らかに再開させることはできますか)?多分どこかに隠された設定がありますか?または、少なくともビルド後のイベントとしてそれを行う方法はあるでしょうか?
いくつかの背景の問題は、依存関係の注入などにSpring.NETを使用していることですが、アプリケーションの起動時にシングルトンをロードします。つまり、Springに関連するコード/構成を変更した場合、開発サーバーを停止する必要があるため、アプリケーションの開始イベントが再度トリガーされることを確認して、次のデバッグ/実行を再開します。つまり、一連のコード/構成を変更してデバッグを再開しても、実際にはstartは実行されていないため、新しいコードは使用されていません。
それで、私はマグナスの答えに基づいた回避策になりましたが、次の比較的単純なマクロを使用します(なぜマクロに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
_
基本的にデバッガーが現在実行中の場合は、デバッガーを停止し、すべてのCassiniインスタンスであるはずの「WebDev.WebServer」という名前のプロセスを強制終了してから、デバッガーを再起動します(これにより、Cassiniが暗黙的に再起動されます)。 proc.Kill()
もproc.CloseMainWindow()
も機能していないように見えるので、私はproc.WaitForExit(1000)
を使用しています...
とにかく、マクロを入手したら、それをキーボードショートカットに割り当てたり、カスタムツールバーボタンを作成して実行したりできます。
回避策:Visual Studio内のASP.Net WebサーバーでGlobal.aspx.cs Application_Start()をデバッグする
Webサーバープロジェクトで「編集して続行」を有効にするとうまくいきました。デバッグを停止してもcassiniをシャットダウンしませんが、デバッグを開始するとcassiniを再起動します。
コマンドラインを開くだけです(runas admin)
以下を実行します。彼ら全員を殺すべきだ
Taskkill /IM WebDev.WebServer40.EXE /F
私が知っている唯一の方法は、post.buildイベントでカスタムCassini起動を行うことです。このカスタムメイドプロセスは、Cassiniのすべてのインスタンスを強制終了し、新しいインスタンスを起動します。これを機能させるには、小さなカスタムコマンドラインユーティリティをビルドする必要があります。ここでは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());
}
}
}
}
}
}
次に、Visual StudioにCassiniを使用しないように指示します。 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はサブプロジェクトにあります。
この投稿と別の投稿に触発 コードのクリーンアップについて マクロをPostDebug-eventとして追加しました。したがって、デバッガーが戻るたびに、すべてのWebDev.WebServer-sが削除されます。 (そして、ProcessName-constraintを緩和しました。)
注:これはおそらくWebServerをall殺すので、他のデバッグセッションの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
別の方法は、Powershellを使用することです。
powershell Stop-Process -name webdev.webserver
_powershell.exe Stop-Process -Name @('WebDev.WebServer*', 'Microsoft.Expression.Web*')
PS:まだ誰かが必要かどうかはわかりませんが、まったく違うものを探しているときに誤ってこのソリューションに遭遇しました。