Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 2715, trackbacks - 3944

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

Decorando con .entrypoint - #2

Giocando con la decorazione con .entrypoint, ho fatto dei piccoli esperimenti.

In sostanza, in questi esperimenti, ho spostato la direttiva .entrypoint dal metodo Main al metodo MyMain, come vedrete negli esempi seguenti. Tutti i metodi MyMain li ho volutamente scelti con la signatura "sbagliata". Le signature corrette sono (secondo la "C# Language Specification", 10.1):

  • static void Main()
  • static void Main(string[] args)
  • static int Main()
  • static int Main(string[] args)

Sono partito da questa:

class Foo
{
  public static string MyMain()
  {
    return "Hello World";
  }
  static void Main()
  {
  }
}

Dopo il classico giro csc->ildasm->ilasm e poi esecuzione, ho incontrato in tutti gli esempi questo errore a runtime: System.MethodAccessException ma con differenti informazioni aggiuntive ("additional information"). La cosa interessante di questo errore è che la sua documentazione dice: "The exception that is thrown when there is an invalid attempt to access a private or protected method inside a class" ma il nostro metodo, MyMain, per il quale è risultato l'errore, è public! Secondo me i ragazzi del CLR potevano creare un'altra classe exception per questa categoria di situazioni...

Nell'esempio sopra, l'additional information è "Entry point must have a return type of void, integer, or unsigned integer" perché infatti il nostro MyMain ritorna una stringa. Abbiamo però scoperto anche questo "unsigned integer" di cui le specifiche C# non parlano! :-)

L'esempio successivo l'ho scelto con un int di ritorno ma con una lista sbagliata di parametri:

class Foo
{
  public static int MyMain(int a, int b)
  {
    return a + b;
  }
  static void Main()
  {
  }
}

L'informazione aggiuntiva all'errore a runtime System.MethodAccessException è stata: "Signature for the entry point has too many arguments", quindi non gli è piaciuto il fatto di aver impostato più argomenti. Allora ne ho immaginato un altro, con numero corretto di argomenti (1) ma di un tipo diverso:

class Foo
{
  public static int MyMain(System.DateTime dt)
  {
    return dt.DayOfYear;
  }
  static void Main()
  {
  }
}

Qui, l'additional information è stata: "Main method for type 80131510 has invalid signature", quindi non gli è piaciuto l'argomento che non era di tipo string[]

La conclusione è che .entrypoint può decorare qualunque metodo che ritorni void, int oppure uint e che questo metodo debba avere zero o al massimo un argomento e, nel caso che l'abbia, debba essere di tipo string[]. L'accessibilità del metodo decorato non ha alcuna importanza, anche se l'errore in tutti questi casi è MethodAccessException.

Print | posted on domenica 8 agosto 2004 01:57 | Filed Under [ Carillon .NET ]

Powered by:
Powered By Subtext Powered By ASP.NET