如何在新进程中启动第二个项目的新实例

时间:2011-09-21 14:57:00

标签: c# process .net-assembly

我正在寻找在单独的类库项目中定义的窗口(WPF)作为新的单独进程。有没有办法做到这一点?

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

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

我有一个包含多个项目的解决方案。

  • StartUp项目是WPF app。,输出类型:Windows应用程序(exe文件)。
  • 所有其他项目都是WFP应用程序,输出类型:类库(dll文件)。

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

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

我想要在新进程中运行应用程序...通常我会使用Process.Start(),但我不能这样,因为它需要exe文件作为agrument而且我有(并且想要)DLL。 / p>

2 个答案:

答案 0 :(得分:3)

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

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");
}

答案 1 :(得分:0)

假设您有一个包含2个项目的解决方案 - 一个项目编译为应用程序(EXE),而第二个项目编译为类库(DLL)。我假设DLL有一些你想要从EXE开始定义的类型(比如一个窗口)。

最简单的方法是添加对DLL的引用。在Solution Explorer中右键单击EXE项目,然后选择添加引用... 。对话框打开时等一下。从项目选项卡中,选择DLL项目。单击“确定”。

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

using secondProject;

到使用WPFWindow的每个代码文件的顶部。我通常使用键盘快捷键CTRL + Period。

自动执行此操作

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

修改

阿列克谢是对的。我想我们这里有一个XY Problem。你要做的事情可能很简单,但是方法(实例化DLL中定义的窗口)不是。

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

考虑添加另一个EXE项目,该项目运行您使用WPFWindow调用的Process。但是,这个建议可能是错误的,因为我们仍然不知道你的最终目标是什么。你在问“我怎么像鸟一样拍打我的翅膀?”当正确的问题可能是“我如何购买机票?”