2014-04-08 19 views
5

Da quando ho installato il nuovo Windows Azure SDK 2.3 ho ricevuto un avvertimento da csrun:.Come avviare Windows Azure Emulator V3.0 dal codice

"interazione DevStore attraverso CSRun è stato depricated Usa WAStorageEmulator.exe invece. "

Quindi ci sono due domande: 1) Come avviare correttamente il nuovo emulatore di memoria dal codice? 2) Come determinare dal codice se l'emulatore di memoria è già in esecuzione?

risposta

5

Ho trovato la soluzione da solo. Ecco il mio codice C#. Il vecchio codice utilizzato per SDK 2.2 è commentato.

public static void StartStorageEmulator() 
{ 
    //var count = Process.GetProcessesByName("DSServiceLDB").Length; 
    //if (count == 0) 
    // ExecuteCSRun("/devstore:start"); 
    var count = Process.GetProcessesByName("WAStorageEmulator").Length; 
    if (count == 0) 
     ExecuteWAStorageEmulator("start"); 
} 

/* 
private static void ExecuteCSRun(string argument) 
{ 
    var start = new ProcessStartInfo 
    { 
     Arguments = argument, 
     FileName = @"c:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" 
    }; 
var exitCode = ExecuteProcess(start); 
Assert.AreEqual(exitCode, 0, "Error {0} executing {1} {2}", exitCode, start.FileName, start.Arguments); 
} 
*/ 

private static void ExecuteWAStorageEmulator(string argument) 
{ 
    var start = new ProcessStartInfo 
    { 
     Arguments = argument, 
     FileName = @"c:\Program Files (x86)\Microsoft SDKs\Windows Azure\Storage Emulator\WAStorageEmulator.exe" 
    }; 
    var exitCode = ExecuteProcess(start); 
    Assert.AreEqual(exitCode, 0, "Error {0} executing {1} {2}", exitCode, start.FileName, start.Arguments); 
} 

private static int ExecuteProcess(ProcessStartInfo start) 
{ 
    int exitCode; 
    using (var proc = new Process { StartInfo = start }) 
    { 
     proc.Start(); 
     proc.WaitForExit(); 
     exitCode = proc.ExitCode; 
    } 
    return exitCode; 
} 
1
using System; 
using System.Diagnostics; 
using System.Linq; 
using System.Threading; 
using Xunit; 

namespace UnitTests.Persistence 
{ 
    public class AzureStorageEmulatorManagerV3 
    { 
     private const string ProcessName = "WAStorageEmulator"; 

     public static void StartStorageEmulator() 
     { 
      var count = Process.GetProcessesByName(ProcessName).Length; 
      if (count == 0) 
       ExecuteWAStorageEmulator("start"); 
     } 

     public static void StopStorageEmulator() 
     { 
      Process process = GetWAstorageEmulatorProcess(); 
      if (process != null) 
      { 
       process.Kill(); 
      } 
     } 

     private static void ExecuteWAStorageEmulator(string argument) 
     { 
      var start = new ProcessStartInfo 
      { 
       Arguments = argument, 
       FileName = @"c:\Program Files (x86)\Microsoft SDKs\Windows Azure\Storage Emulator\WAStorageEmulator.exe" 
      }; 
      var exitCode = ExecuteProcess(start); 
      if (exitCode != 0) 
      { 
       string message = string.Format(
        "Error {0} executing {1} {2}", 
        exitCode, 
        start.FileName, 
        start.Arguments); 
       throw new InvalidOperationException(message); 
      } 
     } 

     private static int ExecuteProcess(ProcessStartInfo start) 
     { 
      int exitCode; 
      using (var proc = new Process { StartInfo = start }) 
      { 
       proc.Start(); 
       proc.WaitForExit(); 
       exitCode = proc.ExitCode; 
      } 
      return exitCode; 
     } 

     public static Process GetWAstorageEmulatorProcess() 
     { 
      return Process.GetProcessesByName(ProcessName).FirstOrDefault(); 
     } 

     [Fact] 
     public void StartingAndThenStoppingWAStorageEmulatorGoesOk() 
     { 
      // Arrange Start 
      AzureStorageEmulatorManagerV3.StartStorageEmulator(); 

      // Act 
      Thread.Sleep(2000); 
      Process WAStorageEmulatorProcess = GetWAstorageEmulatorProcess(); 

      // Assert 
      Assert.NotNull(WAStorageEmulatorProcess); 
      Assert.True(WAStorageEmulatorProcess.Responding); 

      // Arrange Stop 
      AzureStorageEmulatorManagerV3.StopStorageEmulator(); 
      Thread.Sleep(2000); 
      // Act 
      WAStorageEmulatorProcess = GetWAstorageEmulatorProcess(); 

      // Assert 
      Assert.Null(WAStorageEmulatorProcess); 
     } 
    } 
} 
1

vedi la mia risposta here. In realtà utilizza l'API di stato WAStorageEmulator invece di basarsi semplicemente sul test dell'esistenza o meno del processo come in @ huha's own answer.

+0

Sono contento di vedere che questo argomento si evolve. La tua soluzione è davvero più intelligente della mia. Forse è un po 'più lento testare se l'emulatore è in esecuzione, ma questo non dovrebbe davvero importare. – huha