可以在Release中构建后执行#if DEBUG吗?

时间:2017-01-26 12:43:43

标签: c#

在工作中正在进行安全性讨论,以确定是否可以达到以下部署的代码或“#34;悬挂式”"进入...即使它是在RELEASE模式下构建的。

思想?

修改
我做"看"它在DotPeek中 - 即使在Release版本中构建。

  • 然而,该文件是"灰显"

  • 这是否意味着它不会执行?

  • DotPeek仅仅#34;反编译"代码......它没有显示内置模式中存在哪些代码......对吗?

代码看起来像:

    using System;
    using System.ServiceProcess;

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
#if DEBUG
            var myservice = new StpListener();
            myservice.OnDebug();

            //KEEP the service alive
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new StpListener() 
            };
            ServiceBase.Run(ServicesToRun);
#endif
        }
    } 

4 个答案:

答案 0 :(得分:5)

不要将调试/发布配置与条件代码混淆。完全可以将DEBUG条件属性应用于发布模式配置。

看,我是邪恶的!

enter image description here

请参阅:When #if DEBUG runs

答案 1 :(得分:5)

它是编译时功能。一旦编译器完成了它的工作,你 #if#else之间。

你永远不会(只要你留下这些项目)产生一个包含两组代码的二进制文件。

答案 2 :(得分:2)

假设您正在使用Roslyn编译器(尽管所有C#兼容编译器都有可能),#if DEBUG代码甚至不会被编译到IL中,所以它绝对不能被访问。

但是,如果您使用Conditional("DEBUG"),代码将使其成为IL并且只是对它的调用将被删除,因此可能这可能是一个安全漏洞。

答案 3 :(得分:1)

This Resource应该有助于进一步解释,但预编译器命令在编译时进行评估。单独使用它们不会暴露安全漏洞,但这并不意味着它们评估的条件不会成为问题。 #If DEBUGif(Debugger.IsAttached)更安全。你只是不想让你的#If响应运行时条件(无论如何都需要做一些事情)。