我有一个用C#4和WPF编写的Windows应用程序;我现在被问到是否可以添加一个命令行参数(例如/ console)来强制它作为控制台应用程序运行,以便它可以由任务调度程序运行。
现代应用程序可以实现吗?或者我是否需要创建一个单独的控制台应用程序?
更新:我可以强调这是一个 WPF 应用程序。挂钩没有方便的static void Main(string[] args)
入口点。但是PM仍然希望应用程序能够从命令行运行...
最终更新:正如@ RodH257所指出的那样,WPF应用程序编码了预期的静态void。您可以使用相同名称的方法在项目构建属性中添加自己的类,将其设置为可执行文件的启动对象。您还需要方法上的[STAThread]属性,以便WPF也能正常运行。
答案 0 :(得分:4)
是的,Windows GUI应用程序的Main
就像一个控制台应用程序。所以诀窍是在开始UI循环之前做一些预处理Main
。应该注意的是,如果要在Visual Studio中编译为.NET“Windows应用程序”的应用程序内部使用控制台,则必须手动AllocConsole
,因为默认情况下不会获得一个。 / p>
This MSDN forum thread讨论了更多关于“混合控制台/ GUI应用程序”的内容。
答案 1 :(得分:2)
您可以使用dos命令从控制台应用程序中启动它,但是,除非您在运行时修改启动例程(在Main()
中),否则将加载并显示主窗口...如果您不希望显示主窗口,只需重新编码主例程,以便Main()
参数禁用该选项...
而不是:
[STAThread]
static void Main()
{
Application.Run(new MainForm());
}
编码:
[STAThread]
static void Main(params string[] args)
{
if(args.length <= 1)
Application.Run(new MainForm());
else if (args[1].StartsWith("C")) // "C" for "C"onsole version
// Do whatever needs to be done to start
// functionality for console app version
}
然后,当你运行它时,添加/ C开关:
C:\MyCurrentDirectory>MyWinFormsApplicationName.exe /C
答案 2 :(得分:1)
您可以将其转换为控制台应用程序并手动显示第一个WPF对话框。就像你在创建DLL并启动WPF窗口一样,如下所示
static class Program
{
static void Main(params string[] args)
{
if (args.Length > 0)
{
//do stuff here
return;
}
Window1 window = new Window1();
window.ShowDialog();
}
}
或者,查看此链接以编辑当前WPF项目的入口点并根据参数进行操作 How to write custom Main method for a WPF application?
编辑: 更新了帖子,以便更清楚地了解所描述的具体情况。
答案 3 :(得分:0)
这极大地取决于程序最初的编写方式。
如果您以松散耦合的方式编写逻辑,则可以创建另一个控制台应用程序并在那里重用逻辑。这是手动编程/重构工作。
答案 4 :(得分:0)
如果它由任务调度程序运行,则根本不需要任何屏幕。删除startupuri并根据命令行手动启动窗口。
如果它是一个控制台启动过程,只需做你需要的任何处理。否则,启动你的窗户......
答案 5 :(得分:-1)
这是一个article/code sample showing how it's done。构建类型很重要。您的编译器只允许您拥有一个构建目标(例如,GUI,命令行)。