使用基类中的static void Main()方法作为程序的入口点

我想将一些程序逻辑抽象到基类来执行命令行程序(function类似于这个问题所要求的function )。

换句话说,这样的事情:

public abstract class BaseProgram { public static void Main(string[] args) { Console.WriteLine(typeof(T)); } } public class Program : BaseProgram { } 

重要的是要注意BaseProgram在不同的程序集中。

但是,这不起作用。 static void Main(string[] args)方法必须位于派生类中。 谁能解释为什么会这样? 毕竟,以下是完全“合法的”:

 Program.Main(null); BaseProgram.Main(null); 

并将输出:

 > System.String > System.String 

我想知道的是 :这个结果是否有任何记录的原因?

正如在对另一个答案的评论期间最终披露的那样,您的BaseProgram类与您尝试执行的程序集不同。 assembly的入口点必须在assembly中。

否则就像给某人一把钥匙并告诉他们这是你房子前门的钥匙。 除了钥匙实际上对于其他一些完全不同的房子的前门,所以当他们出现在你的房子时它们没有好处。

如果要使用BaseProgramMain()方法,则需要委托给它。 例如,在您自己的程序集中:

 static class Program { public static int Main(string[] args) { return BaseProgram.Main(args); } } 

请注意,对于静态类型或类型的静态成员,不需要实际inheritance基类型,因为您只需通过实际类型名称而不是实例引用来调用它。

我认为问题在于BaseClass是通用的。 为了调用main,你必须提供一个类型参数,那么系统应该选择哪种类型来调用这个方法? 当然,它不能随意选择,所以这是非法的。

我在3.1 Application Startup C# 5.0 Language Specification中找到了这个

应用程序入口点方法可能不在generics类声明中。