Domanda

initializers moduli sono una caratteristica del CLR che non sono direttamente disponibili in C # o VB.NET. Sono metodi globali statici denominati .cctor che sono garantiti per funzionare prima di qualsiasi altro codice (tipo inizializzatori, costruttori statici) in un assieme vengono eseguiti. Recentemente ho voluto usare questo in un progetto e messo insieme la mia soluzione (programma di console / MSBuild compito) utilizzando Mono.Cecil, ma mi chiedevo:

  1. C'è un modo per ingannare il compilatore C # in emettendo intializers modulo? Eventuali attributi (per esempio CompilerGenerated, SpecialName) o altri espedienti che potrebbero essere utilizzati?

  2. Fare la C # / VB.NET mai emettono questi stessi inizializzatori per qualche scopo? Da quello che ho visto che sono utilizzate da C ++ gestito per alcuni scopi di interoperabilità, ma non sono riuscito a trovare alcun riferimento a loro di essere utilizzati per altri scopi. Tutte le idee?

È stato utile?

Soluzione

No, non c'è modo di emettere loro in C #, C #, perché mette tutto in una classe / struct e moduli inizializzatori devono essere globali.

Si dovrà utilizzare uno strumento diverso di scrivere loro, preferibilmente IL-Assembler.

Per quanto riguarda la seconda domanda, devo ammettere che non lo so, ma non ho mai visto nessuna generato da C #, e io uso ILDASM molto spesso, quindi immagino che non li emette.

Altri suggerimenti

Controlla l'addon modulo di inizializzazione del impressionante opensource IL-Tessitore progetto " fody ", scritto da Simon Cropp: https://github.com/fody/moduleinit

E 'permette di specificare un metodo che verrà tradotto in un inizializzatore di montaggio per fody:

public static class ModuleInitializer
{
    public static void Initialize()
    {
        //Init code
    }
}

ottiene questo:

static <Module>()
{
    ModuleInitializer.Initialize();
}

namespace Forse System.Reflection.Emit ti può aiutare. enumerazione MethodAttributes contiene elementi simili (SpecialName, RTSpecialName).

Einar, La tua domanda non ha fatto chiaro per me che già scritto uno strumento che permette di iniettare un inizializzatore modulo in un assieme già compilato.

http://einaregilsson.com/module-initializers-in-csharp

ho provato l'applicazione e funziona perfettamente. Come si scrive dovrebbe funzionare con tutte le strutture attuali 2-4,5.

C'è solo un problema che rende la soluzione inutile per me: Il tuo inizializzazione viene chiamato quando l'applicazione accede prima nulla nel gruppo.

Che cosa ho bisogno è che l'inizializzatore modulo dovrebbe essere chiamato immediatamente quando l'assembly viene caricato nel processo. Ma non è. Quindi, se l'applicazione non accede l'assemblea non potrà mai essere inizializzato.

Dopo aver esaminato un giorno intero a me sembra che l'unico modo per ottenere questo è quello di scrivere un Assembly C ++ gestito ed eseguire il codice in DllMain ().

Se avete costruttori statici o classi singleton cui è possibile accedere vero un compilatore C # variabile statica emetterà .cctor.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top