J'ai un code C standard ANSI qui fait autorité. Cela signifie que même si j'ai la source, je ne peux pas traduire dans une autre langue ni modifier les arguments d'appel, car ces actions invalideraient l'autorité. Il y a plus de 150 fonctions.Obtention de fonctions C++ non gérées à partir de C#
Je peux faire des changements, tels que le changement des noms de fichiers de .c .CPP afin qu'il compile en utilisant Visual Studio 2009 de compilateur C++, que je l'ai fait. Les directives du compilateur et autres peuvent également être ajoutées. Je peux aussi passer par une couche d'emballage, si nécessaire.
Une autre restriction est ma société ne pas veux que je l'utilise dans tout code C# le mot clé dangereux .
Je dois obtenir ces fonctions à partir d'un programme C#.
Une fonction C/C++ typique ressemble à ceci: double SomeFunction(double a, double[3] vec, double[3][3] mat);
Si le contenu du tableau sont parfois entrée, parfois sortie, et rarement les deux.
J'ai d'abord essayé de créer une DLL non managée (avec les fonctions marquées Extern C). Les fonctions avec seulement des arguments simples (int, double) fonctionnaient bien, mais je ne pouvais pas déterminer comment marshal les tableaux. (En fait, j'ai trouvé un exemple de code, mais il était extrêmement complexe et déraisonnable de dupliquer 150 fois.)
J'ai ensuite essayé deux projets dans la même solution, l'un en C++ et l'autre en C#. Dans le projet C++, j'ai créé une fonction gérée qui vient d'appeler la fonction d'origine qui a été marquée comme non gérée. C'était extrêmement propre et simple, et encore une fois, les arguments simples ont bien fonctionné. Mais pour les tableaux, je ne pouvais pas trouver comment faire correspondre les types d'arguments à travers la frontière C# à C++:
Argument '2': cannot convert from 'double[]' to 'double*'
(et comme mentionné ci-dessus, je ne peux pas utiliser dangereux pour obtenir un pointeur).
Certainement ce que j'essaie de faire doit être possible.
Quel est le meilleur moyen d'accéder à ces fonctions?
(Exemple de code utilisant la fonction ci-dessus serait vraiment cool.)
Ah, je vous remercie! La clé de ce problème était qu'en C++ le tableau est déclaré comme double [] [], mais en C# comme double [,]. Bien que la première soit une syntaxe C# légale, elle ne représente pas la même organisation interne. Sans cette idée clé, cela ne fonctionnerait pas. –