C# 是否可以实用地设置输出类型?或者如何添加PropertyGroup条件?
我正在使用命令行应用程序输出类型编程一个应用程序,以在控制台中显示调试信息 我想在编译要发布的应用程序时隐藏控制台。不显示控制台可以通过进入项目属性、应用程序选项卡并将输出类型更改为windows应用程序来轻松完成 但无论如何,我想让用户有机会使用console打开应用程序,即使在发行版中也是如此。为此,我添加了C# 是否可以实用地设置输出类型?或者如何添加PropertyGroup条件?,c#,C#,我正在使用命令行应用程序输出类型编程一个应用程序,以在控制台中显示调试信息 我想在编译要发布的应用程序时隐藏控制台。不显示控制台可以通过进入项目属性、应用程序选项卡并将输出类型更改为windows应用程序来轻松完成 但无论如何,我想让用户有机会使用console打开应用程序,即使在发行版中也是如此。为此,我添加了Dev按钮,当用户单击它时,我希望应用程序打开控制台,并显示所有调试日志输出 我发现这样的答案就这样 如果发布控制台中的应用程序没有打开,那么当开发控制台中的应用程序也打开时,它就可以
Dev
按钮,当用户单击它时,我希望应用程序打开控制台,并显示所有调试日志输出
我发现这样的答案就这样
如果发布控制台中的应用程序没有打开,那么当开发控制台中的应用程序也打开时,它就可以工作了
因此,我认为有两种可能的方法
Dev
按钮,控制台将打开所有以前的日志DevMode
)添加到Properties
文件中,如上面的链接所示。当用户处于发布模式时,他可以单击Dev
按钮,我保存DevMode=true
(在文件中),用户需要重新加载应用程序并再次打开应用程序,但现在我可以看到DevMode==true
,并根据该按钮,即使在发布模式下也可以使用控制台打开应用程序问题是-有可能做到吗?控制台是一个非常古老的东西,其局限性可以追溯到早期的DOS时代。当Windows和图形用户界面的想法还没有完全实现时。除非您能够自如地处理本机Windows API调用,否则这可能是您无法更改的 也就是说:
- 您可以在普通Windows中将控制台显示到GUI应用程序。它确实使用本机API调用,但就这些调用而言似乎相对容易。从无显示应用程序中显示控制台也可能有效
- 也许模仿控制台窗口就足够了?如果您的程序启动一个控制台程序,它可以隐藏控制台窗口和。然后,您可以创建一个表单窗口,模仿普通控制台,并允许用户通过这些流与不可见的控制台对话
- 您可以在普通Windows中将控制台显示到GUI应用程序。它确实使用本机API调用,但就这些调用而言似乎相对容易。从无显示应用程序中显示控制台也可能有效
- 也许模仿控制台窗口就足够了?如果您的程序启动一个控制台程序,它可以隐藏控制台窗口和。然后,您可以创建一个表单窗口,模仿普通控制台,并允许用户通过这些流与不可见的控制台对话
- 控制台是一个非常古老的东西,其局限性可以追溯到早期的DOS时代。当Windows和图形用户界面的想法还没有完全实现时。除非您能够自如地处理本机Windows API调用,否则这可能是您无法更改的
也就是说:
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,您没有得到哪部分?控制台程序有输入和输出