Je travaille sur un projet écrit en C# et utilise une DLL C++ pour communiquer avec un robot. À l'origine, le logiciel a été écrit en C# VS 2003 et a été converti en VS 2008 (pas de changement au code) en utilisant .Net 2.0. Maintenant, j'ai commencé à voir le "Tentative de lire ou d'écrire de la mémoire protégée ..." sur certains ordinateurs. L'erreur de violation d'accès est toujours levée lorsque le code appelle une méthode particulière de la DLL, cependant, cette même méthode est appelée encore et encore tout au long de la tâche et s'exécute correctement, mais parfois elle renvoie l'erreur. De plus, le robot semble bien exécuter la commande qui me dit que les valeurs passées dans la DLL existent et sont donc accessibles.AccessViolationException thrown
Le logiciel avec le .Net 1.1 a été utilisé pendant des années et a fonctionné correctement sans jamais jeter des erreurs de mémoire. Maintenant qu'il utilise .Net 2.0, il ne génère des erreurs que sur certains ordinateurs.
Je ne suis pas sûr de ce qui cause le problème. J'ai exclu l'appel inapproprié (malformation marshalling ...) des méthodes dll car il a fonctionné très bien avec .Net 1.1 pendant des années et devrait donc bien fonctionner dans .Net 2.0 ainsi. J'ai vu quelques messages suggérant que cela pourrait être le GC, mais encore une fois pourquoi cela ne se produirait que sur cet ordinateur et seulement parfois. De plus, les valeurs passées sont toutes des variables globales dans le code C# et doivent donc exister jusqu'à ce que l'application soit fermée et que GC n'ait aucune activité pour déplacer ou supprimer les applications. Une autre observation, comme je l'ai mentionné plus haut, le robot exécute la commande normalement ce qui signifie qu'il obtient toutes ses valeurs nécessaires. Je ne suis pas sûr de ce que la méthode de la DLL de C++ ferait à la fin où le GC pourrait gâcher des choses. Il ne devrait pas essayer de supprimer les variables globales passées et la méthode ne les modifie pas non plus (je n'attends aucune valeur de retour à travers les valeurs passées, la seule valeur de retour est la méthode return qui ne devrait pas avoir quelque chose à voir avec GC.)
Une information importante que je devrais ajouter est que je n'ai pas accès au code C++ et que je ne peux y apporter aucune modification.
Le correctif doit provenir du code C# ou de certains paramètres de l'ordinateur ou de tout autre élément dont je suis responsable. Toute aide grandement appréciée. Merci.
extrait de code: appel de méthode originale en VS 2003
[DllImport("TOOLB32.dll",EntryPoint="TbxMoveWash")]
public static extern int TbxMoveWash(int tArmId, string lpszCarrierRackId,
int eZSelect, int[] lpTipSet, int tVol, bool bFastW);
que je modifié après avoir vu l'erreur à ce qui suit (mais l'erreur se produit encore):
[DllImport("TOOLB32.dll",EntryPoint="TbxMoveWash")]
public static extern int TbxMoveWash(int tArmId, string lpszCarrierRackId,
int eZSelect, [MarshalAs(UnmanagedType.LPArray, SizeConst = 8)] int[] lpTipSet, int tVol, bool bFastW);
Il serait bon de voir ce que fait le code C++ avec ces paramètres. Même si nous ne pouvons pas les changer, il serait utile de savoir exactement ce qui ne va pas. –
Vous ne savez pas exactement ce que vous demandez. Comme je l'ai dit, je n'ai pas le code C++. Un dll que je ne peux pas refactoriser non plus. – user255371