2

我们遇到的一个常见问题是必须根据我们是在本地测试还是为构建服务器提交代码来切换下面的代码。

    /// <summary>
    /// Main entry point to the application.
    /// </summary>
    public static void Main()
    {
        // Don't forget to uncomment this if committing (!)
        //var servicesToRun = new ServiceBase[] {new myservice()};
        //ServiceBase.Run(servicesToRun);

        // and re-comment this
        RunAsConsoleApp();

    }

如果有一种方法可以在代码中测试以告知输出类型,并且避免所有“哦,不,我提交并破坏了构建”的时间浪费,那将非常有用。

        if (IsConsoleApp)
        {
            Using(var host= new ServiceHost(typeof(myservice))
            {
               host.Open();
               etc....
            }
        }
        else
        {
            var servicesToRun = new ServiceBase[] {new myservice()};
            ServiceBase.Run(servicesToRun);
        }
4

4 回答 4

4

您是否尝试过使用Environment.UserInteractive属性代替IsConsoleApp

于 2012-10-16T12:54:56.787 回答
2

Environment.UserInteractive不检测我们是否有控制台在运行,它只检测用户是否可以对正在运行的进程进行某种交互的可能性。如果您想检查应用程序是否是控制台应用程序,我发现它可以工作:

bool is_console_app = Console.OpenStandardInput(1) != Stream.Null;

格伦所有功劳。

于 2017-02-17T12:48:31.230 回答
1

如果你们都绝对不会提交 Debug 构建.. 那么只要在 Project Properties > Build 选项卡下定义了一个 DEBUG 常量,您就可以尝试:

#if DEBUG
    RunAsConsoleApp();
#else
    RunNormally();
#endif

但是,如果有人不小心提交了 Debug 构建,这仍然很容易出错。

于 2012-10-16T12:57:31.213 回答
0

您可以设置单独的构建配置(例如发布 - 服务)并有条件编译语句在代码块之间切换。

请参阅此处了解更多信息:

http://msdn.microsoft.com/en-us/library/aa691095(v=vs.71).aspx

因此,在您的 Release - Service 配置中,定义一个常量,例如 RELEASESERVICE。然后像这样使用:

#if RELEASESERVICE

    etc
于 2012-10-16T12:55:20.343 回答