Domanda

Abbiamo un .NET assembly da un altro progetto in cui in uno dei file generati dal riflettore ha .. frammento di un metodo.

Ora VS 2010 C # compilatore genera tutta una serie di errori di compilazione $$ inaspettati. chiudere bretelle ecc.

In ILDASM vedo questo metodo insieme a molti altri menzionati, ma in codice generato trovo solo 1 di questi metodi compilatore-cgenerated che entrano.

Come fare per la compilazione?

È stato utile?

Soluzione

Questi sono normalmente creato da matrici static readonly. Non sarà loro compilazione. Anche riflettore è notevolmente buggy ricreare qualsiasi cosa ma il codice banale.

Vi suggerisco di ottenere il codice sorgente originale.

Altri suggerimenti

Quelli sono generati automaticamente dal compilatore, credo che per le cose come oggetti di espressione lambda (per i quali non si fornisce alcun nome). Credo che siano i nomi non validi, proprio perché il compilatore vuole per assicurarsi che non v'è alcun conflitto con il proprio codice; si sta solo andando ad avere per rinominarli prima di ri-compilazione.

In tutti i casi che ho visto questo ha a che fare con inizializzatori di array. Se si guardano le tipologie creati in Noterete che il compilatore ha appena creato una struttura diversa per ogni matrice di dimensione si è inizializzato. Il compilatore fa questo per ridurre le dimensioni IL, allocazione di memoria di velocità per gli elementi della matrice e per mantenere gli elementi di matrice memorizzati nella memoria insieme e in ordine. Senza arrivare a profondità nelle erbacce mi limiterò a ricordare che facendo in questo modo si intende qualsiasi inizializzazione di matrice di dimensione accade in un numero limitato e costante di istruzioni IL. Non ricordo dalla mia scavo in ILDASM ma penso che fosse 4. Assegnazione di uno a un mezzo di tempo di 4 istruzioni per elemento.

Ora al vostro problema specifico. Non è poi così male, una volta ti rendi conto che sei solo si occupano di casi tipo di valore che devono essere rinominato. Alcuni ricerca riflettore dovrebbe rivelare i casi in cui vengono utilizzati gli oggetti compilatore ha generato. La dichiarazione originale e l'inizializzazione sarà intatta in origine. Questo è tutto quello che dovete seguire anche se con una ridenominazione globale per quell'oggetto. Scegliere qualsiasi nome che si desidera e sostituire il nome generato del compilatore. Ho messo qualche altro codice qui sotto che illustra questo. Per i dizionari che l'inizializzazione bisogno pure ottimizza e crea una nuova istanza per ogni Dizionario chiamato <> f_switch $ MAPN dove n è di nuovo un contatore.

Avrete anche a che fare con una sciocchezza simile per tutte le proprietà dei campi backing sono stati generati automaticamente per. Stesso fix però. Crea il tuo campo di supporto e utilizzarlo.


[CompilerGenerated]
internal class <PrivateImplementationDetails>
{
    // Fields
    internal static $ArrayType$4 $$field-0; // data size: 4 bytes
    internal static $ArrayType$4 $$field-1; // data size: 4 bytes
    internal static $ArrayType$4 $$field-2; // data size: 4 bytes
    internal static $ArrayType$4 $$field-3; // data size: 4 bytes
    internal static $ArrayType$44 $$field-4; // data size: 44 bytes
    internal static $ArrayType$4 $$field-5; // data size: 4 bytes

    // Nested Types
    [StructLayout(LayoutKind.Explicit, Size=4, Pack=1)]
    private struct $ArrayType$4
    {
    }

    [StructLayout(LayoutKind.Explicit, Size=0x2c, Pack=1)]
    private struct $ArrayType$44
    {
    }
}

static GATWavHelper()
{
    riffBytes = new byte[] { 0x52, 0x49, 70, 70 };
    waveBytes = new byte[] { 0x57, 0x41, 0x56, 0x45 };
    fmtBytes = new byte[] { 0x66, 0x6d, 0x74, 0x20 };
    dataBytes = new byte[] { 100, 0x61, 0x74, 0x61 };
    headerSize = 0x2c;
    floatToInt16RescaleFactor = 0x7fff;
    __canonicalHeader = new byte[] { 
        0x52, 0x49, 70, 70, 0, 0, 0, 0, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 
        0, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 100, 0x61, 0x74, 0x61, 0, 0, 0, 0
     };
}

// Fields
[CompilerGenerated]
private static Dictionary<string, int> <>f__switch$map0;
.
.
.
if (<>f__switch$map0 == null)
{
    Dictionary<string, int> dictionary = new Dictionary<string, int>(3);
    dictionary.Add("false", 0);
    dictionary.Add("true", 1);
    dictionary.Add("null", 2);
    <>f__switch$map0 = dictionary;
}

if (<>f__switch$map0.TryGetValue(nextWord, out num))
{
    switch (num)
.
.
.

dal menu Visualizza, selezionare le opzioni.

Verifica la selezione Optimization. Dal momento che si sta utilizzando l'ultima versione di VS, è necessario specificare per ottimizzare .Net 4.0 o almeno 3.5 per ottenere il supporto per lambda.

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