我们遇到的常见问题是必须根据我们是在本地测试还是为构建服务器提交代码来切换下面的代码。
/// <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);
}
答案 0 :(得分:4)
您是否尝试使用Environment.UserInteractive属性代替IsConsoleApp
?
答案 1 :(得分:1)
如果您肯定不会提交Debug构建..那么只要在Project Properties&gt;下定义了DEBUG常量。构建选项卡,您可以尝试:
#if DEBUG
RunAsConsoleApp();
#else
RunNormally();
#endif
但是,如果有人不小心提交了Debug版本,那么这仍然是容易出错的。
答案 2 :(得分:1)
Environment.UserInteractive
未检测到我们是否正在运行控制台,它只检测用户是否可以与正在运行的进程进行某种交互。
如果你想检查应用程序是否是一个控制台应用程序,我发现这个工作:
bool is_console_app = Console.OpenStandardInput(1) != Stream.Null;
Glen here的所有积分。
答案 3 :(得分:0)
您可以设置单独的构建配置(例如Release - Service)并使用条件编译语句在代码块之间切换。
请点击此处了解更多信息:
http://msdn.microsoft.com/en-us/library/aa691095(v=vs.71).aspx
因此,在您的发布 - 服务配置中,定义一个常量,例如RELEASESERVICE。然后使用它:
#if RELEASESERVICE
etc