Fond: J'utilise les bibliothèques gérées DirectX 9.0 pour transformer des tableaux de points 3d en coordonnées d'écran 2D. Pour la vitesse, j'utilise UnsafeNativeMethods pour faire toutes les transformations.Pourquoi ce code lance System.ExecutionEngineException
Le problème: Si ma fonction de coupure de ligne personnalisé est utilisé ma demande meurt sans jeter aucune exception, il m'a fallu un certain temps pour comprendre qu'il vomissait un uncatchableSystem.ExecutionEngineException
. Je l'ai réduit à se produire à cause des deux dernières lignes de ma fonction d'écrêtage.
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);
}
Lorsque la liste verticesAfterClipping
est copiée sur les sommets lineToClip
l'objet lineToClip
est ensuite transmis à un UnsafeNativeMethod qui transforme ces sommets aux sommets 2d. De tout ce que je peux voir quand je le franchis en mode Débogage, il fonctionne parfaitement, jusqu'à ce qu'il meure.
Je n'arrive tout simplement pas à comprendre ce qui ne va pas. Toute aide serait très appréciée.
Vous avez raison lorsque vous dites que l'exception ne se produit pas sur ces deux lignes, mais cela se produit comme un résultat de ces deux lignes. J'ai remplacé ces lignes et utilisé un autre tampon temporaire pour copier les sommets écrêtés et tout fonctionne correctement maintenant.J'ai supposé qu'il y avait une sorte de violation d'accès de mémoire se produisant sous les couvertures quand la ligne a été passée aux méthodes natives sûres de directx. – tbridge
Ne supposez pas que l'absence d'ExecutionEngineException signifie que le problème a disparu. Il se peut simplement que le CLR ne le détecte plus. En remplaçant ces lignes, vous pouvez maintenant être dans une situation où les données sont corrompues, mais vous ne recevez plus d'exception. (Le CLR ne peut pas et ne peut pas garantir de lancer ExecutionEngineException chaque fois que quelque chose comme ça va mal, il ne le lance que quand il arrive à le remarquer.) Donc je serais inquiet - j'essayerais certainement d'aller au fond des choses * comment * le crash s'est produit, comme maintenant, il n'y a aucune raison d'être sûr que vous l'avez vraiment corrigé. –