2010-04-09 33 views
12

快速的問題,有什麼方法可以調用你的主要方法嗎?還是它必須被稱爲「主()」?C#自行命名Main()方法的方法?

+0

這從來沒有從我這裏,只因爲你可以只有一個線在Main()內並從那裏調用任何你想要的。儘管我對答案感興趣.. – 2010-04-09 19:38:48

+0

除了好奇之外,還有其他原因嗎? 有人有這樣的引用:「如果調試比編寫新代碼難兩倍,那麼根據定義,你不夠聰明來調試你能想到的'最聰明'的代碼。」與公約混在一起就屬於這一類。 – 2010-04-09 20:53:49

回答

18

注意這是一個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 
     } 
    } 
} 
+0

謝謝偉大的答案。非常有趣 – Chilln 2010-04-09 20:08:03

+1

非常歡迎您,感謝您的榮譽。作爲事後考慮,我想知道像PostSharp這樣的工具是否可以將IL(.entrypoint)的適當部分注入到用特定屬性修飾的方法中,從而避免需要命名爲Main的入口點的C#「限制」 ()。 – 2010-04-09 20:10:35

1

它必須被稱爲Main()。

1

它需要被稱爲Main(),因爲它是應用程序的入口點。

名稱和限制由框架定義。下面是MSDN頁面以供參考:

Main (C#)

+0

顯然這是C#約定,而不是.NET Framework約定。 – 2010-04-09 20:01:23

+0

@Justin:你知道你提供了一個.NET 1.1的鏈接嗎?我已經修復它沒有版本號。 – 2010-04-09 20:01:44

1

它被稱爲主。

如果您真的想要,您可以創建自己的方法,並將其稱爲Main中唯一的代碼行。

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

是否有任何理由讓主要公衆? MSDN表示它不應該公開... – IVlad 2010-04-09 19:43:41

1

不是......主要是標準的。你可以做的是從項目屬性的「啓動對象」設置中更改託管Main方法的類

但是,真的,爲什麼你想要?大家都知道,它的主要...這樣你會迷惑其他開發人員可以看看你的代碼

1

從「Main() and Other Methods (C# vs Java)」:

每一個C#應用程序必須包含一個主要方法,其中指定的程序執行即將開始。

+0

@brydgesk:請嘗試提供MSDN鏈接,而不要在其中包含版本號。他們將永遠是最新的。 – 2010-04-09 20:04:11

5

你可以調用你的main方法,但它不會被稱爲應用程序中的第一種方法,除非它被稱爲Main。還有其他一些要求和要注意的事項。從MSDN

  • Main方法是程序的入口點,程序控制開始和結束。
  • 它是在類或結構中聲明的。它必須是靜態的,不應該公開。
  • 它可以有一個void或int返回類型。
  • Main方法可以用或不用參數聲明。
  • 可以將參數讀爲零索引的命令行參數。
  • 與C和C++不同,程序的名稱不被視爲第一個命令行參數。
+0

@Mark:最好提供沒有版本號的MSDN鏈接,因爲它們將始終引用當前版本。 – 2010-04-09 20:05:31

3

我不相信有辦法做到這一點對事物的C#的一面,但如果你願意編輯您的IL很容易足以進入IL中並添加.entrypoint函數。查看wikipedia上的CLI條目。