Je tente de consommer une DLL écrite en C++ à partir d'une application C#. J'ai un code source tiers pour la DLL C++ (le moteur physique Cyclone) et je ne veux pas le porter manuellement sur C#.Utilisation d'une DLL C++ en C#
Dans le projet C++
je l'ai changé pour produire une dll. Je l'ai changé pour utiliser le drapeau/clr. Je l'ai changé pour utiliser la DLL de débogage Multi-threaded (/ MDd) parce que c'était le seul compatible avec/clr et aussi compilé.
Dans le projet C#
J'ai ajouté une référence à la dll. J'utilise l'espace de noms cyclone.
Au début, il n'y avait absolument rien sous l'espace de noms. Je pense que c'est parce que dans le code C++, toutes les classes ont été déclarées sans modificateurs d'accès et la valeur par défaut est private. Donc, pour la classe « particules » J'ai changé la définition:
public class Particle
{
//...
}
Maintenant, je peux déclarer avec succès une variable de type de particules à partir du code C#. Cependant, intellesense et le navigateur d'objets rapportent que Particle est une structure (?) Et ne contient aucune méthode. Le code C++ déclare un tas de méthodes après les modificateurs d'accès "public:" donc je ne sais pas quel est le problème.
Par exemple,
public:
void integrate(real duration);
Qu'est-ce que je fais mal?
Merci, garder les différences entre C# et C++ est très difficile pour moi pour une raison quelconque ... L'outil P/Invoke Interop Assistant référencé par Caelum être capable de générer un wrapper automatiquement? Ou y a-t-il d'autres outils qui peuvent accomplir cela? – colithium
P/Invoke est un moyen d'appeler du code natif qui n'est pas compilé avec/clr. Vous ne pourrez toujours pas instancier la classe, vous pouvez seulement appeler des fonctions. Une autre approche peut consister à laisser la DLL en l'état et à créer une nouvelle DLL C++ managée. Celui-ci contient une API gérée, conçue pour être facile à utiliser depuis .net. L'implémentation appelle ensuite la DLL native. Vous devriez facilement trouver des exemples de travail sur le net. –