假设我有3个独立的.net核心控制台应用程序项目:HelloWorld
、Consumer
和Spawner
。
假设程序集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
相同的进程(和线程等(中运行。您可以将强类型参数传递给它,HelloWorld
和Consumer
将共享static
状态,如果一个部分导致崩溃,则两个部分都将停止,等等。
Spawner.Main
启动一个单独的过程;请参阅Process
的文档。这就像您自己在命令行上调用了HelloWorld
一样。Spawner
和HelloWorld
之间没有共享状态。Spawner
启动的进程甚至不需要用C#或.NET.编写
通常:
-
如果
HelloWorld
是一个库,那么编写HelloWorld
的人希望您引用它并从自己的代码中调用它。但是像Main
这样的名字在这种情况下是非常罕见的;通常有很多方法可以调用来做不同的事情,它们有更具体的名称、参数、返回类型等。 -
如果
HelloWorld
是一个独立的应用程序,那么编写HelloWorld
的人希望您将其称为一个单独的进程,包括来自可能与调用者不同的技术堆栈的进程。(例如,C#可以使用Process
对象来启动用许多其他语言编写的程序的进程。(
我在想为什么我们不总是公开Main,让其他人用两个选项调用程序集:调用方法或生成新进程。
你并不总是希望给人们选择。也许你的Main
做了一些程序其他部分需要的基本设置——在这种情况下,你不希望其他人把你的Main
作为某个单独程序的一部分来调用,这可能会有不同的设置。
您基本上回答了自己,您不需要生成一个单独的进程。您可以从不同的控制台应用程序调用公共Main()
,它就会工作。
然而,如果你遇到这样的情况,你可能首先要问自己为什么这些是分开的。不同的入口点是必要的,以保持这些东西彼此独立运行,单独部署等等。明显的最大区别是,当生成不同的进程时,它会自动完全并行运行。