Pregunta

Tenemos un ensamblaje .NET de otro proyecto en el que en uno de los archivos generados a partir de reflector tiene .. fragmento de un método.

Ahora VS 2010 compilador de C # lanza todo tipo de errores de compilación $$ inesperados. 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 que vienen.

Cómo ir sobre la compilación?

¿Fue útil?

Solución

Estos son normalmente creada por matrices static readonly. No se le compilarlas. También reflector es notablemente con errores nada recreando pero el código trivial.

Yo sugiero que el código fuente original.

Otros consejos

Aquellos son generadas automáticamente por el compilador, creo que para cosas como objetos de expresiones lambda (para el que no se proporciona ningún nombre). Creo que son nombres válidos, precisamente porque el compilador quiere asegurarse de que no hay ningún conflicto con su propio código; sólo vamos a tener que cambiar el nombre de ellos antes de volver a compilar.

En todos los casos que he visto esto, tiene que ver con inicializadores de matriz. Si nos fijamos en los tipos creados en usted notará que el compilador acaba de crear una estructura diferente para cada matriz de tamaño que haya inicializado. El compilador de este para reducir el tamaño IL, asignación de memoria de velocidad para los elementos de la matriz y para mantener los elementos de matriz almacenados en la memoria junto y en orden. Sin llegar a lo profundo de las malas hierbas que voy a mencionar que hacerlo de esta manera, cualquier matriz de tamaño inicialización ocurre en un número conocido y constante de instrucciones IL. No me acuerdo de mi excavación en ILDASM pero creo que era 4. Asignación de uno en un medio tiempo 4 instrucciones por elemento.

Ahora, para su problema específico. No es tan malo una vez que se da cuenta de que simplemente está tratando con las instancias de tipo de valor que deben ser renombrado. Algunas búsquedas en el reflector debe revelar los casos en que se utilizan los objetos compilador generado. La declaración e inicialización originales serán intacto en la fuente. Eso es todo lo que necesita para seguir aunque con un cambio de nombre global para ese objeto. Escoja cualquier nombre que desee y vuelva a colocar nombre generado del compilador. Pongo algún otro código de abajo que ilustra esto. Para Diccionarios necesidad de que la inicialización, así se optimiza y crea una nueva instancia para cada diccionario llamado <> $ f_switch MAPN donde n es un contador de nuevo.

También va a lidiar con tonterías similares para las propiedades de los campos de respaldo fueron generados automáticamente para. La misma solución sin embargo. Crear su propio campo de respaldo y utilizarlo.


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

En el menú Ver, seleccionar opciones.

Compruebe la selección optimización. Puesto que usted está utilizando la última versión de VS, debe especificar para optimizar .Net 4.0 o al menos 3,5 para obtener apoyo a lambdas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top