我有一个简单的问题,我确信它已得到解答,但我似乎无法找到我正在寻找的解决方案。
我的基本问题是我在.Net中创建了一个控制台应用程序,它每天都在任务调度程序上自动运行,但现在我的客户端还需要一个基于Windows窗体的界面,可以用来运行特殊的运行(它们使用GUI指定一些参数 - 例如特定日期等 - 以使程序运行方式略有不同。)
我认为这样做的方法是将我的控制台应用程序转换为WinForm解决方案并包含命令行参数,以便我希望它作为默认的原始控制台应用程序运行,但我认为这不是正确的方式,因为它仍然会涉及表单加载。
我的另一个想法是将“引擎”部分转换为DLL并制作2个可执行文件 - 一个是控制台应用程序,另一个是winforms应用程序,但我不确定这是否正确/可能导致更多维护。
这样做的正确方法是什么?
我在VB中写这个,但如果对你来说更容易,我对C#解决方案同样感到满意。
谢谢!
答案 0 :(得分:11)
通常情况下,我会将逻辑拆分为一个库,然后创建一个简单的控制台应用程序和一个简单的Forms应用程序来调用库中的逻辑。
然后,您可以单独分发这些内容并按预期使用它们,而无需重复代码。
答案 1 :(得分:8)
您可以修改您的Program.cs以接受参数,然后如果某些args已经传递到您的应用程序中,并从main退出,否则启动您的主表单,如下所示:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (ProcessCommandLine(args))
return;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static bool ProcessCommandLine(string[] args)
{
//Process it, if some has been processed return true, else return false
}
}
答案 2 :(得分:2)
或者您可以使表单不可见,并使用您的第一个选项,阅读命令行。
这是一种使邀请形式不可见的方法。 Form Invisible
答案 3 :(得分:2)
Reed建议的三个项目是正确的方法,但是如果你真的需要1个可执行文件(我们出于某种原因我们真的想要一个案例)你可以做以下事情:
static class Program
{
[STAThread]
static void Main(string[] args)
{
if (args[0]== "-ui")
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
System.Windows.Forms.Application.Run(new MyFormWork());
}
else if (args[0] == "-console")
{
Helper.AllocConsole();
DoYourConsoleWork();
Helper.FreeConsole();
}
}
public static class Helper
{
[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();
[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();
}
答案 4 :(得分:0)
1:您可以使用XML作为参数。你的控制台只需要读取XML参数。 然后创建一个表单应用程序,仅用于编辑XML并保存。
优点: 您的应用程序正在由任务计划程序运行,因此您的表单不需要。 对于用户来说,可以轻松打开表单应用程序并更改将保存为xml的内容
Console --run every day without any notice
Argument.xml -- argument for Console .
Form -- user interface
2:你可以在一个表单中混合使用它,但它会在每天以形式为基础运行