如何在新的过程中启动新的项目实例

本文关键字:启动 项目实例 过程中 | 更新日期: 2023-09-27 18:09:09

我希望显示在单独的类库项目中定义为新的单独进程的窗口(WPF)。有什么办法可以做到吗?

我需要在新进程中启动第二个项目实例,因为当我通过这种方式启动它时,有占用的内存:

secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();

我有一个解决方案与多个项目。

  • 启动项目为WPF应用程序,输出类型为Windows应用程序(exe文件)
  • 其他项目均为WFP app,输出类型:类库(dll文件)。

现在我正在运行"应用程序"(在这个解决方案中的其他项目构建为dll)通过以下代码:

secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();

我想要的是运行的应用程序在新的进程…通常我会使用Process.Start(),但我不能是这种情况,因为它需要exe文件作为协议,我有(并想要)dll。

如何在新的过程中启动新的项目实例

你可以将命令行参数传递给主.exe来告诉它运行哪个"子应用程序"。然后,主.exe可以在一个新进程中启动自己,并告诉新实例运行哪个子应用程序。例如,在主.exe应用程序中,在应用程序类中放入这样的逻辑:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        //See if exactly one command line argument was passed
        if (e.Args.Length == 1)
        {
            //See if the argument is one of our 'known' values
            switch (e.Args[0])
            {
                case "launchApp2":
                    secondProject.WPFWindow win2 = new secondProject.WPFWindow();
                    win2.Show();
                    break;
                case "launchApp3":
                    thirdProject.OtherWPFWindow win3 = new thirdProject.OtherWPFWindow();
                    win3.Show();
                    break;
            }
        }
        //Probably want to call the base class always?
        base.OnStartup(e);
    }
}

当你想在一个新进程中启动其中一个子应用程序时,你可以这样做:

public void LaunchApp2()
{
    //Start a new process that is ourself and pass a command line parameter to tell
    //  that new instance to launch App2
    Process.Start(Assembly.GetEntryAssembly().Location, "launchApp2");
}

让我们假设您有两个项目的解决方案-一个项目编译为应用程序(EXE),而第二个项目编译为类库(DLL)。我假设DLL中定义了某种类型(例如,一个窗口),您希望从EXE启动该类型。

要做到这一点,最简单的方法是添加对DLL的引用。在解决方案资源管理器中右键单击EXE项目,选择Add Reference…。请稍等,对话框打开。从Projects选项卡中选择DLL项目。单击OK。

现在,在您的EXE项目中,WPFWindow将作为导入类型可用。你需要添加一个

using secondProject;

放到使用WPFWindow的每个代码文件的顶部。我通常使用键盘快捷键CTRL + Period自动执行此操作。

我所描述的方法是在c#中使用dll的标准方法。可以手动加载它们,但这有点复杂,并且可能不是您想要做的。 编辑:

Alexei是正确的。我认为这是一个XY问题。您尝试做的事情可能很容易,但方法(实例化在DLL中定义的窗口)不是。

请注意,您运行的任何代码(在您的情况下,您的WPFWindow)必须来自应用程序,即使代码本身是在DLL中定义的。DLL本身通常不向操作系统提供关于如何运行其中包含的任何代码的信息。

考虑添加另一个EXE项目,运行您使用Process调用的WPFWindow。这个建议可能是错误的,因为我们仍然不知道你的最终目标是什么。你问的是"我怎么才能像鸟一样扇动翅膀?",而正确的问题应该是"我怎么买机票?"