Question

Nous avons un assemblage .NET à partir d'un autre projet où dans l'un des fichiers générés à partir de réflecteur a .. extrait pour une méthode.

compilateur VS 2010 c # jette toutes sortes d'erreurs de compilation $$ inattendues. fermer accolades etc.

Dans ILDASM je vois cette méthode ainsi que beaucoup d'autres mentionnés, mais dans le code généré je trouve que 1 de ces méthodes de compilateur cgenerated à venir dans.

Comment aller sur la compilation?

Était-ce utile?

La solution

Ceux-ci sont normalement créés par des réseaux de static readonly. Vous ne serez pas les compiler. Aussi réflecteur est notamment bogué quoi que ce soit la recréation mais le code trivial.

Je suggère que vous obtenez le code source d'origine.

Autres conseils

Ceux-ci sont générés automatiquement par le compilateur, je crois pour des choses comme des objets d'expression lambda (pour laquelle vous ne fournissez pas de nom). Je crois qu'ils sont des noms invalides précisément parce que le compilateur veut assurer qu'il n'y ait pas de conflit avec votre propre code; vous allez juste devoir les renommer avant re-compilation.

Dans tous les cas, je l'ai vu ce qu'il a à faire avec initializers Array. Si vous regardez les types créés, vous remarquerez que le compilateur vient de créer une structure différente pour chaque tableau de taille que vous avez initialisé. Le compilateur ne présente pour réduire la taille IL, allocation de mémoire de vitesse pour les éléments de réseau et de maintenir les éléments de réseau stockées dans la mémoire en même temps et en ordre. Sans se rendre à profondément dans les mauvaises herbes, je vais juste mentionner que ce faisant de cette façon: toute initialisation du tableau de taille se produit dans un nombre connu et constant d'instructions IL. Je ne me souviens pas de mon creuser dans ildasm mais je pense qu'il était 4. Affectation d'un à un moyen de temps 4 instructions par élément.

Maintenant à votre problème spécifique. Il est pas si mal une fois que vous réalisez que vous êtes juste traiter des cas de type de valeur qui ont besoin d'être renommé. Certaines recherches dans le réflecteur devrait révéler les cas où les objets générés compilateur sont utilisés. La déclaration d'origine et l'initialisation est intacte dans la source. C'est tout ce que vous devez suivre mais avec un changement de nom global pour cet objet. Choisissez le nom que vous voulez et remplacer le nom généré par le compilateur. Je mets une autre code ci-dessous qui illustre cela. Pour les dictionnaires que l'initialisation du besoin et il optimise et crée une nouvelle instance pour chaque dictionnaire appelé <> f_switch $ MAPN où n est un compteur à nouveau.

Vous aurez également à faire face à un non-sens similaire pour toutes les propriétés des champs d'accompagnement ont été générées automatiquement pour. fix même si. Créez votre propre champ de support et de l'utiliser.


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

Dans le menu, sélectionnez Options.

Vérifier la sélection d'optimisation. Puisque vous utilisez la dernière version de VS, vous devez spécifier à optimiser pour .Net 4.0 ou au moins 3,5 pour obtenir un soutien pour lambdas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top