【发布时间】:2019-03-09 17:25:58
【问题描述】:
我有一个具有控制台或 WPF 功能的混合应用程序。 WPF 应用程序是否启动或在控制台窗口中完成某些操作取决于启动时的参数。我能够实现这一点(在stackoverflow上有很多例子可以找到)。现在我希望,如果 WPF 应用程序启动,控制台窗口将关闭。但这会显示出来,如果我关闭它,WPF 应用程序也会关闭。
这是我当前的实现。
using System;
using System.Windows;
namespace MyNamespace
{
class Program
{
[STAThread]
static void Main(string[] args)
{
string option = args[0];
switch (option)
{
case "WPF":
RunApplication();
break;
default:
DoSomething();
break;
}
}
private static void RunApplication()
{
Application app = new Application();
app.Run(new MainWindow());
Environment.Exit(0);
}
private static void DoSomething()
{
// …
}
}
}
如果我尝试在新的Thread 中启动应用程序,应用程序将直接关闭,并且不会显示 WPF 窗口。
using System.Threading;
using System.Threading.Tasks;
private static void RunApplication()
{
new Thread(() => {
Application app = new Application();
app.Run(new MainWindow());
}).Start();
Environment.Exit(0);
}
我不知道如何实现这一点。有没有可能做到这一点?
【问题讨论】:
-
你为什么打电话给
Environment.Exit(0);? -
试试 process.start("yourwpf.exe");
-
@Mat J 我在一个例子中找到了它。如果我删除此行,我会收到一个错误,即调用
Thread必须是 STA-Thread。 -
@Andy 我不认为这会改变什么。这是同一个应用程序,根据参数具有不同的行为,但在两个路径中都使用了一部分。我可以将应用程序划分为控制台应用程序、WPF 应用程序和共享组件。然后我可以从控制台应用程序调用 WPF 应用程序,这将被关闭。但我更愿意将它保存在一个应用程序中。
-
在新的
Thread中启动 WPF 窗口后,我可以避免 STA 异常。我必须将Thread启动方法更改为Thread thread = new Thread(...); thread.SetApartmentState(ApartmentState.STA); thread.Start();行为与没有新的Thread相同。
标签: c# wpf console-application