C# 如何从代码启动Windows Azure Storage Emulator V3.0

C# 如何从代码启动Windows Azure Storage Emulator V3.0,c#,azure,azure-storage,azure-storage-emulator,C#,Azure,Azure Storage,Azure Storage Emulator,自从我安装了新的Windows Azure SDK 2.3后,我从csrun收到一条警告: “通过CSRun的DevStore交互已被消除。请改用WAStorageEmulator.exe。” 因此有两个问题: 1) 如何从代码正确启动新的存储仿真器? 2) 如何从代码中确定存储仿真器是否已在运行?我自己找到了解决方案。这是我的密码。用于SDK 2.2的旧代码被注释掉 public static void StartStorageEmulator() { //var count = Pr

自从我安装了新的Windows Azure SDK 2.3后,我从csrun收到一条警告:

“通过CSRun的DevStore交互已被消除。请改用WAStorageEmulator.exe。”

因此有两个问题: 1) 如何从代码正确启动新的存储仿真器?
2) 如何从代码中确定存储仿真器是否已在运行?

我自己找到了解决方案。这是我的密码。用于SDK 2.2的旧代码被注释掉

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;
}

看看我的答案。它实际上使用了WAStorageEmulator状态API,而不是像@huha那样简单地依赖于测试进程是否存在。

参见我的答案。它使用了一个简洁的小NuGet包,以编程方式帮助启动/停止Azure Storage Emulator:。

我很高兴看到这个主题有所发展。你的解决方案比我的更聪明。如果模拟器正在运行,测试可能会稍微慢一点,但这并不重要。
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);
        }
    }
}