Suppose that I have 3 separate .net core console application projects: `HelloWorld`, `Consumer`, and `Spawner`.

Assume the assembly `HelloWorld` comes from a third party. And I know its `Main` method is public. 

**HelloWorld:**

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

```

**Consumer:**

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

```

**Spawner:**

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

```

Questions
=========

Now I want to make use of the `HelloWorld` assembly. 
Which method I have to implement, invoking as I did in the `Consumer` project or spawning as in `Spawner` project?

What are the differences between invoking the `public Main` of an assembly and invoking the assembly with `Process`? 

I am thinking of why we don't always make the `Main` public so others can invoke it with 2 options: calling the method or spawning a new process. Or my understanding is wrong? Any comments are also welcome!