Frage

Wir haben eine .NET-Assembly aus einem anderen Projekt, bei dem in einen der generierten Dateien von Reflector hat .. Schnipsel für ein Verfahren.

Jetzt VS 2010 c # -Compiler wirft alle möglichen Kompilierungsfehler $$ unerwartet. schließen Klammern etc.

In ILDASM ich sehe diese Methode zusammen mit vielen anderen erwähnt, aber in generierten Code finde ich nur 1 dieser Compiler-cgenerated Methoden kommen in.

Wie gehen über das Kompilieren?

War es hilfreich?

Lösung

Diese normalerweise durch static readonly Arrays erstellt. Sie werden kompilieren sie nicht. Auch Reflektor ist vor allem Buggy Erschaffungs alles andere als trivial Code.

Ich schlage vor, Sie den ursprünglichen Quellcode erhalten.

Andere Tipps

Die vom Compiler automatisch generiert werden, glaube ich, für Dinge wie Lambda-Ausdruck-Objekte (für die Sie bieten keinen Namen). Ich glaube, sie sind ungültige Namen, gerade weil der Compiler sicherstellen will es keinen Konflikt mit Ihrem eigenen Code ist; Sie gehen nur um sie zu benennen, bevor erneut kompilieren.

In allen Fällen, die ich gesehen habe dies mit Array initializers zu tun hat. Wenn Sie die Typen sehen in Ihnen erstellt werden bemerken, dass der Compiler hat gerade eine andere Struktur für jede Größe Array erstellt Sie initialisiert haben. Der Compiler ist diese IL Größe, Geschwindigkeit Speicherzuordnung für die Arrayelemente zu reduzieren und die Feldelemente in dem Speicher zusammen und gespeichert, um zu halten. Ohne in dem Unkraut zu tief immer erwähnen werde ich nur, dass es auf diese Art und Weise ist jede Größe Feldinitialisierung in einer bekannten und konstanten Zahl geschieht Anweisungen von IL tun. Ich kann nicht von meinem Graben in ILDasm erinnern, aber ich glaube, es war 4.es Zuweisen eines nach dem anderen Mittel 4 Anweisungen pro Element.

Jetzt auf Ihr spezielles Problem. Es ist nicht so schlimm, wenn Sie erkennen, Sie nur mit dem Werttyp-Instanzen zu tun, dass Bedarf umbenannt werden. Einige Such in Reflektor sollten die Instanzen zeigen, wo die Compiler generierten Objekte verwendet werden. Die ursprüngliche Deklaration und Initialisierung werden in Quelle intakt sein. Das ist alles, was Sie für das Objekt zwar mit einem globalen Umbenennungs folgen müssen. Wählen Sie einen beliebigen Namen und ersetzen Sie den generierten Namen des Compilers. Ich habe einige andere Code unten, dass dies zeigt. Für Wörterbücher dass Bedarf Initialisierung und es optimiert und erstellt eine neue Instanz für jedes Wörterbuch namens <> F_SWITCH wird $ MAPN wobei n ein Zähler wieder.

Sie werden auch mit ähnlichem Unsinn für alle Eigenschaften der Trägerfelder wurden automatisch generieren für beschäftigen. Gleiche fix though. Erstellen Sie Ihr eigenes Träger Feld und verwenden Sie es.


[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)
.
.
.

aus dem Menü Ansicht, wählen Sie Optionen.

Überprüfen Sie die Optimierung Auswahl. Da Sie die neueste Version von VS verwenden, sollten Sie optimieren für .Net 4.0 oder mindestens 3,5 angeben Unterstützung für Lambda-Ausdrücke zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top