2010-12-15 10 views
7

Tenemos un ensamblado .NET de otro proyecto en el que en uno de los archivos generados desde Reflector tiene ... un fragmento para un método.

Ahora el compilador VS 2010 C# arroja todo tipo de errores de compilación $$ inesperado. cerrar llaves etc.

En ILDASM i ver este método junto con muchos otros mencionados, pero en el código generado i encontrar sólo 1 de estos métodos de compilación-cgenerated entrando.

Cómo ir sobre la compilación?

Respuesta

4

Normalmente son creados por static readonly arrays. No los compilará. También Reflector es especialmente buggy recreando cualquier cosa menos un código trivial.

Le sugiero que obtenga el código fuente original.

+0

Obtuve uno de estos, y fue debido a una serie de constantes (ints), por ejemplo 'if (new [] {16, 32, 42, 64, 314, 1337} .Contains (something)) {. ..} '. –

+0

Suena como un buen paso de seguridad (mejor que ofuscarlo). Estaría muy agradecido si ahora sabes de otra manera? –

1

Esos son generados automáticamente por el compilador, creo que para cosas como los objetos de expresión lambda (para los cuales no proporciona ningún nombre). Creo que son nombres inválidos precisamente porque el compilador quiere asegurarse de que no haya ningún conflicto con su propio código; solo vas a tener que cambiarles el nombre antes de volver a compilar.

+0

de cambio de nombre a WAHT? donde esta el codigo no tengo una fuente original. estamos trabajando con código desensamblado y este fragmento existe en el archivo egenrated. Cómo deshacerse de esto u obtener esta compilación. –

+0

Sí, quiero decir en su código desensamblado, busque/reemplaza global, donde para cada ' {GUID} .method $$ ****' único que ve, lo reemplaza con un identificador válido. – Mehrdad

0

En el menú Ver, seleccione las opciones.

Verifica la selección de Optimización. Como está utilizando la última versión de VS, debe especificar optimizar para .Net 4.0 o al menos 3.5 para obtener soporte para lambdas.

0

En todos los casos que he visto esto tiene que ver con los inicializadores de matriz. Si observa los tipos creados en, notará que el compilador acaba de crear una estructura diferente para cada matriz de tamaño que haya inicializado. El compilador hace esto para reducir el tamaño de IL, la asignación de memoria de velocidad para los elementos de la matriz y para mantener los elementos de la matriz almacenados en la memoria juntos y en orden. Sin llegar a profundizar en las malas hierbas, mencionaré que hacerlo de esta manera significa que cualquier inicialización de matriz de tamaño ocurre en un número conocido y constante de instrucciones IL. No puedo recordarlo al cavar en ILDasm, pero creo que fue 4. Asignar uno a la vez significa 4 instrucciones por elemento.

Ahora a su problema específico. No es tan malo una vez que te das cuenta de que solo estás tratando con instancias de tipo de valor que necesitan ser renombradas. Algunas búsquedas en reflector deberían revelar las instancias en las que se utilizan los objetos generados por el compilador. La declaración original y la inicialización estarán intactas en la fuente. Sin embargo, eso es todo lo que necesita seguir con un cambio de nombre global para ese objeto. Elija cualquier nombre que desee y reemplace el nombre generado del compilador. Puse otro código a continuación que ilustra esto. Para diccionarios que también necesitan inicialización, optimiza y crea una nueva instancia para cada diccionario llamado <> f_switch $ mapn donde n es un contador nuevamente.

También tratará con tonterías similares para cualquier propiedad para la que se generaron automáticamente los campos de respaldo. La misma solución, sin embargo. Crea tu propio campo de respaldo y úsalo.


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