Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以实用地设置输出类型?或者如何添加PropertyGroup条件?_C# - Fatal编程技术网

C# 是否可以实用地设置输出类型?或者如何添加PropertyGroup条件?

C# 是否可以实用地设置输出类型?或者如何添加PropertyGroup条件?,c#,C#,我正在使用命令行应用程序输出类型编程一个应用程序,以在控制台中显示调试信息 我想在编译要发布的应用程序时隐藏控制台。不显示控制台可以通过进入项目属性、应用程序选项卡并将输出类型更改为windows应用程序来轻松完成 但无论如何,我想让用户有机会使用console打开应用程序,即使在发行版中也是如此。为此,我添加了Dev按钮,当用户单击它时,我希望应用程序打开控制台,并显示所有调试日志输出 我发现这样的答案就这样 如果发布控制台中的应用程序没有打开,那么当开发控制台中的应用程序也打开时,它就可以

我正在使用命令行应用程序输出类型编程一个应用程序,以在控制台中显示调试信息

我想在编译要发布的应用程序时隐藏控制台。不显示控制台可以通过进入项目属性、应用程序选项卡并将输出类型更改为windows应用程序来轻松完成

但无论如何,我想让用户有机会使用console打开应用程序,即使在发行版中也是如此。为此,我添加了
Dev
按钮,当用户单击它时,我希望应用程序打开控制台,并显示所有调试日志输出

我发现这样的答案就这样

如果发布控制台中的应用程序没有打开,那么当开发控制台中的应用程序也打开时,它就可以工作了

因此,我认为有两种可能的方法

  • 当用户处于释放模式时,他可以单击
    Dev
    按钮,控制台将打开所有以前的日志
  • 将一些变量(如
    DevMode
    )添加到
    Properties
    文件中,如上面的链接所示。当用户处于发布模式时,他可以单击
    Dev
    按钮,我保存
    DevMode=true
    (在文件中),用户需要重新加载应用程序并再次打开应用程序,但现在我可以看到
    DevMode==true
    ,并根据该按钮,即使在发布模式下也可以使用控制台打开应用程序

  • 问题是-有可能做到吗?

    控制台是一个非常古老的东西,其局限性可以追溯到早期的DOS时代。当Windows和图形用户界面的想法还没有完全实现时。除非您能够自如地处理本机Windows API调用,否则这可能是您无法更改的

    也就是说:

    • 您可以在普通Windows中将控制台显示到GUI应用程序。它确实使用本机API调用,但就这些调用而言似乎相对容易。从无显示应用程序中显示控制台也可能有效
    • 也许模仿控制台窗口就足够了?如果您的程序启动一个控制台程序,它可以隐藏控制台窗口和。然后,您可以创建一个表单窗口,模仿普通控制台,并允许用户通过这些流与不可见的控制台对话

      • 控制台是一个非常古老的东西,其局限性可以追溯到早期的DOS时代。当Windows和图形用户界面的想法还没有完全实现时。除非您能够自如地处理本机Windows API调用,否则这可能是您无法更改的

        也就是说:

        • 您可以在普通Windows中将控制台显示到GUI应用程序。它确实使用本机API调用,但就这些调用而言似乎相对容易。从无显示应用程序中显示控制台也可能有效
        • 也许模仿控制台窗口就足够了?如果您的程序启动一个控制台程序,它可以隐藏控制台窗口和。然后,您可以创建一个表单窗口,模仿普通控制台,并允许用户通过这些流与不可见的控制台对话

        您可以将程序编译为控制台应用程序(即使是Windows窗体应用程序),并使用以下代码以编程方式隐藏控制台窗口:

        void HideConsole()
        {
            MyConsole.HideConsole();
        }
        
        internal class MyConsole
        {
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
        
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        
            [DllImport("kernel32")]
            static extern bool AllocConsole();
        
            const int SW_HIDE = 0;
            const int SW_SHOW = 5;
        
            public static void HideConsole()
            {
                var handle = GetConsoleWindow();
        
                // Hide
                ShowWindow(handle, SW_HIDE);
            }
        
            public static void ShowConsole()
            {
                AllocConsole();
            }
        }
        
        void ShowConsole()
        {
            MyConsole.ShowConsole();
        }
        
        还有另一种方法,将程序编译为Windows窗体应用程序,并以编程方式显示控制台窗口:

        void HideConsole()
        {
            MyConsole.HideConsole();
        }
        
        internal class MyConsole
        {
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
        
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        
            [DllImport("kernel32")]
            static extern bool AllocConsole();
        
            const int SW_HIDE = 0;
            const int SW_SHOW = 5;
        
            public static void HideConsole()
            {
                var handle = GetConsoleWindow();
        
                // Hide
                ShowWindow(handle, SW_HIDE);
            }
        
            public static void ShowConsole()
            {
                AllocConsole();
            }
        }
        
        void ShowConsole()
        {
            MyConsole.ShowConsole();
        }
        

        但是请注意,这段代码可能无法直接在VisualStudio中工作,因为VisualStudio可能会重定向控制台输入。但是,如果直接运行应用程序,它应该可以正常工作。

        您可以将程序编译为控制台应用程序(即使是Windows窗体应用程序),并使用以下代码以编程方式隐藏控制台窗口:

        void HideConsole()
        {
            MyConsole.HideConsole();
        }
        
        internal class MyConsole
        {
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
        
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        
            [DllImport("kernel32")]
            static extern bool AllocConsole();
        
            const int SW_HIDE = 0;
            const int SW_SHOW = 5;
        
            public static void HideConsole()
            {
                var handle = GetConsoleWindow();
        
                // Hide
                ShowWindow(handle, SW_HIDE);
            }
        
            public static void ShowConsole()
            {
                AllocConsole();
            }
        }
        
        void ShowConsole()
        {
            MyConsole.ShowConsole();
        }
        
        还有另一种方法,将程序编译为Windows窗体应用程序,并以编程方式显示控制台窗口:

        void HideConsole()
        {
            MyConsole.HideConsole();
        }
        
        internal class MyConsole
        {
            [DllImport("kernel32.dll")]
            static extern IntPtr GetConsoleWindow();
        
            [DllImport("user32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        
            [DllImport("kernel32")]
            static extern bool AllocConsole();
        
            const int SW_HIDE = 0;
            const int SW_SHOW = 5;
        
            public static void HideConsole()
            {
                var handle = GetConsoleWindow();
        
                // Hide
                ShowWindow(handle, SW_HIDE);
            }
        
            public static void ShowConsole()
            {
                AllocConsole();
            }
        }
        
        void ShowConsole()
        {
            MyConsole.ShowConsole();
        }
        

        但是请注意,这段代码可能无法直接在VisualStudio中工作,因为VisualStudio可能会重定向控制台输入。但是,如果您直接运行应用程序,它应该可以正常工作。

        mm,它看起来是一个非常好的解决方案。但是我现在在
        Console.WriteLine()
        我得到
        System.IO.IOException:“句柄无效。
        是否意味着现在我必须用
        Console.WriteLine()
        try/catch
        包装每个地方?现在检查我更新的代码,它使用了不同的方法。嗯,这看起来真是一个不错的解决方案。但是我现在在
        Console.WriteLine()
        我得到
        System.IO.IOException:“句柄无效。
        这是否意味着现在我必须用
        Console.WriteLine()
        try/catch
        包装每个地方?检查我更新的代码,它现在使用了不同的方法。我不明白一些事情,但在第一种情况下,我成功打开了控制台,但此控制台不显示任何
        console.WriteLine()
        log输出。。。对于我没有得到的第二个解决方案,你是什么意思(你能解释一下吗?或者举个例子吗?Thanks@AlekseyTimoshchenko(新的)控制台可能不包含我怀疑的以前的输出。您可能需要存储这些输出。|对于选项2,您没有得到什么部分?控制台程序有输入和输出流?您可以重定向它们?您可以在模拟控制台窗口中向内容显示并从用户处获取输入?我不明白,但在第一个案例我成功打开了控制台,但是这个控制台没有显示任何
        console.WriteLine()
        log输出…对于第二个解决方案,我没有得到,您的意思是什么(您能解释一下吗?或者举个例子吗?Thanks@AlekseyTimoshchenko(新的)控制台可能不包含我之前怀疑的输出。您可能需要存储该输出。|对于选项2,您没有得到哪部分?控制台程序有输入和输出