【问题标题】:Using static void Main() method from base class as a program's entry point使用基类中的静态 void Main() 方法作为程序的入口点
【发布时间】:2017-07-05 21:36:42
【问题描述】:

我想将一些程序逻辑抽象为一个基类,用于执行命令行程序(功能类似于this question was requesting)。

换句话说,是这样的:

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

public class Program : BaseProgram<string>
{
}

请务必注意,BaseProgram 位于不同的程序集中。

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

Program.Main(null);
BaseProgram<string>.Main(null);

会输出:

> System.String
> System.String

我想知道的:是否有任何记录在案的原因导致此结果?

【问题讨论】:

  • 我想是因为它无法实例化隐式启动对象。您是否尝试明确设置启动对象?
  • 使用 Program.Main() 作为入口点并在那里实例化您自己的类树。
  • 是的,@abatishchev,这就是我为实现我所追求的功能所做的工作,但我想知道它是否有理由不使用 Main 方法在基类中。
  • @BradleyDotNET 不,我没有。但是,它不允许我将基类设置为启动对象。只有“程序”类可用。也许是因为它在不同的项目中?
  • 明确设置为Program可能工作。

标签: c# console-application entry-point


【解决方案1】:

正如在另一个答案的评论中最终披露的那样,您的 BaseProgram&lt;T&gt; 类与您尝试执行的程序集位于不同的程序集中。程序集的入口点必须在那个程序集中。

不这样做就像给某人一把钥匙,然后告诉他们那是你家前门的钥匙。除了钥匙实际上是其他完全不同的房子的前门,所以当他们出现在你家时,对他们没有好处。

如果你想使用BaseProgram&lt;T&gt;Main()方法,你需要委托给它。例如,在您自己的程序集中:

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

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

【讨论】:

    【解决方案2】:

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

    我在C# 5.0 Language Specification3.1 Application Startup 中找到了这个

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

    【讨论】:

    • 我刚刚从基类中删除了 Generic 参数,它仍然无法编译(我也无法将其设置为“启动对象”)。这将绝对有意义...
    • 那个规格。完全支持你的答案。但是,我仍然相信这是一个不同的问题。当我使Program 泛型和BaseProgram 非泛型(例如Program&lt;T&gt; : BaseProgram)时,我收到不同的编译器错误:为 Main 方法指定的错误 14 'Program' must be a valid class or struct Program.cs
    • 当然这可能是原因。如果项目类型不是类库,则每个项目都应该有一个单独的 main 方法。你为什么不说你有两个独立的项目?
    • @skeryl:当然是这个原因。程序集的入口点必须在该程序集中!如果您提到是这种情况,您的问题会在 19 分钟前得到正确回答。
    • @skeryl:它不会“删除任何使用”抽象。这意味着您需要在 your 程序集中定义一个有效的入口点。您始终可以将实际功能委托给另一个程序集,包括通过继承然后调用的通用基类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多