当可以调用公共Main时,为什么我们需要生成另一个进程

  • 本文关键字:我们 进程 另一个 调用 Main c#
  • 更新时间 :
  • 英文 :


假设我有3个独立的.net核心控制台应用程序项目:HelloWorldConsumerSpawner

假设程序集HelloWorld来自第三方。我知道它的Main方法是公开的。

HelloWorld:

namespace HelloWorld
{
public class HelloWorld
{
public static void  Main()
{
Console.WriteLine("Hello World");
}
}
} 

消费者:

namespace Consumer
{
class Consumer
{
static void  Main()
{
HelloWorld.HelloWorld.Main();
}
}
} 

房主:

namespace Spawner
{
class Spawner
{
static void  Main()
{
Process p = new Process();
p.StartInfo.FileName = "HelloWorld.exe";
p.Start();
p.WaitForExit();
}
}
} 

问题

现在我想使用HelloWorld程序集。我必须实现哪种方法,像在Consumer项目中那样调用,还是像在Spawner项目中那样生成?

调用程序集的public Main和使用Process调用程序集有什么区别?

我在想为什么我们不总是公开Main,这样其他人就可以用两个选项来调用它:调用方法或生成新进程。或者我的理解是错误的?欢迎任何评论!

调用程序集的public Main和用Process调用程序集有什么区别?

Consumer.Main调用HelloWorld.Main就像调用任何其他方法一样,因此HelloWorld.Main在与Consumer相同的进程(和线程等(中运行。您可以将强类型参数传递给它,HelloWorldConsumer将共享static状态,如果一个部分导致崩溃,则两个部分都将停止,等等。

Spawner.Main启动一个单独的过程;请参阅Process的文档。这就像您自己在命令行上调用了HelloWorld一样。SpawnerHelloWorld之间没有共享状态。Spawner启动的进程甚至不需要用C#或.NET.编写

通常:

  • 如果HelloWorld是一个库,那么编写HelloWorld的人希望您引用它并从自己的代码中调用它。但是像Main这样的名字在这种情况下是非常罕见的;通常有很多方法可以调用来做不同的事情,它们有更具体的名称、参数、返回类型等。

  • 如果HelloWorld是一个独立的应用程序,那么编写HelloWorld的人希望您将其称为一个单独的进程,包括来自可能与调用者不同的技术堆栈的进程。(例如,C#可以使用Process对象来启动用许多其他语言编写的程序的进程。(

我在想为什么我们不总是公开Main,让其他人用两个选项调用程序集:调用方法或生成新进程。

你并不总是希望给人们选择。也许你的Main做了一些程序其他部分需要的基本设置——在这种情况下,你不希望其他人把你的Main作为某个单独程序的一部分来调用,这可能会有不同的设置。

您基本上回答了自己,您不需要生成一个单独的进程。您可以从不同的控制台应用程序调用公共Main(),它就会工作。

然而,如果你遇到这样的情况,你可能首先要问自己为什么这些是分开的。不同的入口点是必要的,以保持这些东西彼此独立运行,单独部署等等。明显的最大区别是,当生成不同的进程时,它会自动完全并行运行。

最新更新