簡體   English   中英

當調用公共 Main 成為可能時,為什么我們需要生成另一個進程?

[英]Why do we need to spawn another process when invoking the public Main can be made possible?

假設我有 3 個獨立的 .net 核心控制台應用程序項目: HelloWorldConsumerSpawner

假設程序集HelloWorld來自第三方。 而且我知道它的Main方法是公開的。

你好世界:

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以便其他人可以使用 2 個選項調用它:調用該方法或產生一個新進程。 還是我的理解有誤? 也歡迎任何意見!

你幾乎回答了自己,不需要產生一個單獨的進程。 您可以從不同的控制台應用程序調用公共Main()並且它將起作用。

但是,如果您遇到這種情況,您可能不得不質疑自己為什么首先將它們分開。 需要不同的入口點來保持這些東西彼此獨立運行、單獨部署等。明顯的最大區別是,當產生不同的進程時,它會自動完全並行運行。

調用程序集的公共 Main 和使用 Process 調用程序集有什么區別?

Consumer.Main調用HelloWorld.Main就像調用任何其他方法一樣,因此HelloWorld.MainConsumer同一進程(和線程等)中運行。 您可以將強類型 arguments 傳遞給它, HelloWorldConsumer將共享static state,如果一個部分導致崩潰,兩個部分都將停止,等等。

Spawner.Main啟動一個單獨的進程; 請參閱Process的文檔 就像您自己在命令行上調用了HelloWorld一樣。 Spawner 和HelloWorld之間沒有共享的Spawner Spawner啟動的過程甚至不需要在 C# 或 .NET 中編寫。

通常:

  • 如果HelloWorld是一個庫,那么編寫HelloWorld的人希望您引用它並從您自己的代碼中調用它。 但是在這種情況下,像Main這樣的名稱非常罕見。 通常,您可以調用許多方法來執行不同的操作,這些方法具有更具體的名稱、參數、返回類型等。

  • 如果HelloWorld是一個獨立的應用程序,那么編寫HelloWorld的人希望您將它作為一個單獨的進程調用,包括來自可能與調用者不同的技術堆棧。 (例如,C# 可以使用Process object 來啟動以許多其他語言編寫的程序的進程。)

我在想為什么我們不總是公開 Main 以允許其他人使用 2 個選項調用程序集:調用方法或產生新進程。

你並不總是想讓人們選擇。 也許您的Main做了一些基本設置,而您的程序的 rest 需要 - 在這種情況下,您不希望其他人將您的Main作為某個單獨程序的一部分調用,這些程序的設置可能不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM