是否有任何简单的C#代码示例从外部调用带有公共修饰符的Main()?

时间:2015-10-24 04:31:34

标签: c#

引自this site (click)

  

Main在类或结构中声明。 Main必须是静态的,不应该是公共的

这意味着Main方法可以是公开的。

现在考虑以下两个项目:

项目1:HelloWorld

using static System.Console;

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

我将public修饰符指定给Main。 然后我编译它以生成一个名为HelloWorld.exe的应用程序。

项目2:祈求者

namespace Invoker
{
    class Program
    {
        static void Main()
        {
            // I want to invoke Main in HelloWorld.exe here.
            // How to do it?
        }
    }
}

此项目尝试调用Main

中定义的HelloWorld.exe

问题

不使用ProcessInvoker.exe如何在Main中定义公开HelloWorld.exe?此问题用于查找从外部调用公共Main的示例。这就是为什么我不想使用Process

1 个答案:

答案 0 :(得分:2)

Main 不应该是公开的,因为它不应该被程序集中的任何其他方法调用。只有CLR应该能够在应用程序启动时调用它。访问说明符不以与CLR管理的程序集相同的方式(如果有的话)应用于CLR。

如果你想让它公开;但这意味着任何其他应用程序都可以在没有反射的情况下引用它。

那是运行时的作用;刚开始寻找名为" Main"的静态方法使用各种签名然后调用它找到的第一个签名。可能是这样的:

foreach(Type type in assembly.GetTypes())
{
    foreach(MethodInfo methodInfo in type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
    {
        if (methodInfo.Name == "Main" /*TODO: && methodInfo.Parameters is valid*/)
        {
            methodInfo.Invoke(null, new object[0]);
        }
    }
}