C#如何自定义命名Main()方法?

12

快速问题,是否有一种方法可以任意命名主方法?或者它必须被称为“Main()”?


这对我来说从未出现过,因为你只能在Main()中有一行代码,然后从那里调用任何你想要的东西。不过我对答案很感兴趣。 - George Mauer
除了好奇心之外还有其他原因吗?有人引用过这样一句话:“如果调试比编写新代码难两倍,那么根据定义,你不够聪明,无法调试出你所能想出的‘最智能’的代码。” 改变约定俗成的规则也完全属于这个范畴。 - Jim L
11个回答

19

请注意,这是C#的惯例,而不是.NET运行时的惯例。您可以在IL中任意命名方法:

.module Mane.exe
.subsystem 3
.corflags 9

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
  .ver 2:0:0:0
}

.assembly Mane
{
    .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 
    .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = ( 01 00 01 00 00 ) 
    .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 )
    .custom instance void [mscorlib]System.Resources.NeutralResourcesLanguageAttribute::.ctor(string) = ( 01 00 05 65 6E 2D 55 53 00 00 )

    .permissionset reqmin
               = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'Execution' = bool(true)}}
    .hash algorithm 0x00008004
    .ver 1:0:0:0
}

.namespace Mane
{
    .class private abstract auto ansi sealed beforefieldinit Program extends [mscorlib]System.Object
    {
        .method private hidebysig static void Mane() cil managed
        {
            .entrypoint
            .maxstack 1
            ldstr "Hello, World!"
            call void [mscorlib]System.Console::WriteLine(class System.String)
            ret
        }
    }
}

非常感谢您的答案。真的很有趣。 - Chilln
1
非常感谢,谢谢你的赞扬。顺便说一句,我想知道像PostSharp这样的工具是否可以将适当的IL部分(.entrypoint)注入到装饰有特定属性的方法中,从而避免C#“限制”入口点需要命名为Main()的问题。 - Jesse C. Slicer

5
您可以将主方法命名为其他名称,但是除非它被命名为Main,否则它不会作为应用程序中的第一个方法被调用。还有一些其他要求和注意事项。来自MSDN
  • Main方法是您的程序的入口点,程序控制从这里开始和结束。
  • 它声明在类或结构体内。它必须是静态的,且不应该是public。
  • 它可以具有void或int返回类型。
  • Main方法可以带参数或不带参数。
  • 参数可以读取为零索引的命令行参数。
  • 与C和C++不同,程序的名称不被视为第一个命令行参数。

3

我不相信在C#方面有这样的方法,但是如果你愿意编辑你的IL,很容易就可以添加.entrypoint到IL函数中。请参阅维基百科上的CLI入口。


1

它必须被称为Main。

如果你真的想要,你可以创建自己的方法,并将其作为代码中唯一的一行调用到 Main 中。

public static void Main(String[] args)
{
    Mane(args);
}

1

1

它必须被称为Main()。


1

它需要被称为Main(),因为这是应用程序的入口点。

名称和限制由框架定义。以下是MSDN页面供参考:

Main (C#)


显然,这是C#约定,而不是.NET Framework约定。 - John Buchanan

1

不,Main是标准的。但您可以更改托管Main方法的类,从项目属性的“启动对象”设置中更改。

但真的,为什么要这样做呢?每个人都知道它是main ... 所以您会让其他可能查看您代码的开发人员感到困惑。


1

0

你不能更改“Main”的名称,因为它是默认情况下始终会首先运行的空虚。不过,如果你想要,你可以创建另一个空虚并立即通过main调用它,虽然使用Main();可能更简单。

using System;
class Program 
{


static void Main(string[] args) // Manages the login input
{
     OnScriptStarted();
}
static void OnScriptStarted()
{
    // code goes here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接