Pregunta

Antecedentes: Estoy usando bibliotecas DirectX 9.0 conseguido transformar las matrices de puntos 3D a coordenadas de pantalla 2d. Para la velocidad utilizo los UnsafeNativeMethods para hacer todas las transformaciones.

El problema: Si mi función de línea de recorte personalizado se utiliza mis matrices de aplicación sin lanzar ninguna excepción, me tomó un tiempo para averiguar que estaba lanzando un inalcanzable System.ExecutionEngineException. He reducido a suceder debido a las dos últimas líneas de mi función de recorte.

List<Vector3> verticesAfterClipping = new List<Vector3>;
public unsafe void ClipLine(Line lineToClip)
{
    this.verticesAfterClipping.Clear();

    // Clipping algorithm happens here... (this is psuedo-code of what it does)
    foreach(Vertex in lineToClip.Vertices)
    {
        bool thisIsClipped =   // Set to whether this vertex is clipped
        bool lastWasClipped =  // Set to whether last vertex was clipped

        if(thisIsClipped == false && lastWasClipped == true)
        {
            verticesAfterClipping.Add( /* intersection on clipping plane */ );
            verticesAfterClipping.Add( /* thisVertex */ );
        }
        else if (thisIsClipped == false && lastWasClipped == false)
        {
            verticesAfterClipping.Add( /* thisVertex */ );
        }
        else if (thisIsClipped == true && lastWasClipped == false)
        {
            verticesAfterClipping.Add(/* intersection on clipping plane */);
        }
    }

    // THIS IS WHERE BAD THINGS HAPPEN
    lineToClip.Vertices = new Vertex[verticesAfterClipping.Count];
    verticesAfterClipping.CopyTo(lineToClip.Vertices, 0);
}

Cuando la lista verticesAfterClipping se copia en los vértices lineToClip el objeto lineToClip se pasa entonces a un UnsafeNativeMethod que transforma estos vértices a los vértices 2D. De todo lo que puedo ver cuando me paso a través de él en modo de depuración está funcionando completamente bien, hasta que apenas se muere.

Yo simplemente no puede averiguar lo que está mal. Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

El problema en realidad no puede estar ocurriendo en la línea que se produce una excepción. Este puede ser un síntoma de algo que sucedió antes.

La excepción System.ExecutionEngineException se produce cuando el CLR detecta que algo ha salido terriblemente mal. Esto puede pasar un tiempo considerable después de ocurrido el problema. Esto se debe a que la excepción es generalmente el resultado de la corrupción de las estructuras internas de datos - los descubridores CLR que algo ha entrado en un estado que no tiene sentido. Se produce una excepción inalcanzable porque no es seguro proceder.

Así que es posible que tenga algo de código en alguna parte totalmente sin relación del sistema que corrompe algo, pero esto sólo se hace evidente cuando este pedazo particular de carreras de código. El código que has mostrado podría estar muy bien. (También podría no ser ... No veo nada malo obvio, pero luego no sé bien las bibliotecas administradas DX 9. No puedo ver qué característica de este método requiere la palabra clave insegura, por ejemplo. )

Desafortunadamente, esto significa que necesita para iniciar la fundición de una red poco más amplio. Casi cualquier cosa que sea usos código no seguro, o interoperabilidad COM es potencialmente sospechoso. Este será un proceso largo y tedioso, por desgracia. Una forma es posible acercarse a lo que es tratar gradualmente la simplificación del programa: ¿cuál es la más pequeña pieza de código que puede ilustrar el problema? (Por ejemplo, si se pone el código que has demostrado no en una aplicación que no contiene nada más, excepto el más simple llamada sea posible a ese método, ¿todavía fallan?)

Otros consejos

Tengo el mismo problema con diferentes bibliotecas. En mi caso todo empezó mucho antes, porque tenía que ejecutar una aplicación .NET de 32 bits en un entorno de 64 bits. Bueno, esto me causa muchos problemas, la compatibilidad entre arquitecturas, o entre el CLR de su plataforma .NET puede ser su problema también.

PD: Ahora sé lo es mi problema, pero no tienen idea de donde es que

.

Tengo dos clases que tienen que ver con una tabla en particular en mi base de datos

Almacenamiento del - una clase que tiene métodos que manejan las interacciones directas con la base de datos

Controlador - una clase que tiene métodos para manejar las llamadas a la API

Cuando está a punto de crearse una nueva entrada en la tabla, puedo comprobar tablas secundarias para ciertos valores que ya puedan existir.

Me escribió estos métodos para comprobar si hay preexistentes / duplicados en la clase equivocada, lo que terminó provocando la executingengineexception ser expulsado para mí.

Moviendo los métodos para que vivían con el contexto de base de datos correcta parecía arreglarlo para mí.

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