AccessViolationException lors de l'appel de la fonction la plus élémentaire c ++ à laquelle je puisse penser à partir de code managé

StackOverflow https://stackoverflow.com/questions/844169

  •  20-08-2019
  •  | 
  •  

Question

J'essaie d'apprendre à utiliser l'interopérabilité du code géré / non géré, mais je me suis heurté à un mur que 4 heures de recherches sur Google n'ont pas réussi à surmonter. J'ai mis en place 2 projets dans Visual Studio, l'un créant un fichier exe win32 et l'autre créant une application .NET pour Windows Forms. Après avoir fait le tour de la machine, j'ai obtenu le code C # à appeler correctement dans le code c ++, mais à partir de là, j'ai commencé à obtenir AccessViolationException chaque fois que j'y suis entré. Voici le code du fichier .cpp:

        extern "C" __declspec(dllexport) void QuickTest()
    {
        int iTest = 0;
        int aTestArray[3] = {1,2,3};
        return;
    }

Et voici le code de l'application Windows Forms C # qui l'appelle:

        [DllImport("UnmanagedEvaluation2.exe")]
        static extern void QuickTest();

Assez simple non? L'appel fonctionne et je peux entrer dans le code c ++ (j'ai activé le débogage non géré pour le projet), mais il meurt sur le tableau en créant une ligne à chaque fois avec AccessViolationException. Le même code fonctionne correctement lorsque j'exécute l'exécutable (le code c ++ est dans un projet d'application console, j'ai essayé de l'appeler à partir de la fonction _tmain et aucun problème), mais lorsqu'il appelle depuis .NET, il explose à chaque fois.

Il doit y avoir quelque chose d’évident qui me manque, mais je n’ai rien trouvé d’utile en lisant des tutoriels, et la plupart des articles sur cette exception concernent des personnes qui ont des problèmes avec des marshalings ou des GCHandles compliqués. Merci d’avance pour votre aide.

Mise à jour: Tu étais juste en dessous, mais c'est bizarre. Au début, quand j'ai commencé cela, j'ai supposé que je ne serais pas capable de le faire (appeler des fonctions dans des exécutables), mais lorsque j'ai essayé, cela a effectivement fonctionné. Il semble que cela vous permette d'appeler une fonction dans un exécutable, mais dès que vous essayez d'allouer de la mémoire, celle-ci meurt. Quoi qu'il en soit, merci pour le conseil, il semble fonctionner correctement maintenant.

Était-ce utile?

La solution

Vous ne pouvez pas appeler des fonctions dans des exécutables en dehors de ces exécutables. Vous devez compiler votre code dans une DLL.

Autres conseils

Vous avez déclaré votre fonction comme extern "C", ce qui signifie qu'elle utilise cdecl comme convention d'appel. Par défaut, DllImport utilise StdCall comme convention d'appel. C'est peut-être la raison pour laquelle votre code plante.

Essayez d'importer votre fonction dans le code .NET en tant que

    [DllImport("UnmanagedEvaluation2.exe", CallingConvention=CallingConvention.Cdecl)]
    static extern void QuickTest();

Voir http://msdn.microsoft. com / fr-fr / library / system.runtime.interopservices.callingconvention.aspx pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top