2010-07-02 3 views
1

Hé les gars, je crée une DLL en C++ et je veux qu'elle soit utilisable depuis les applications .NET (C# et VB.NET). Je suis récuré l'Internet pour obtenir des conseils et ce que j'ai trouvé à ce jour suggèrent:Astuces pour créer une DLL C++ à utiliser à partir de .NET

  • Déclarant mon C++ fonctionne comme extern C et en utilisant __stdcall
  • Utilisation des types C de base pour les paramètres et les types de retour au lieu de STL conteneurs (par exemple char * au lieu de std :: string)
  • Utilisation des pointeurs pour les paramètres d'entrée qui doivent être modifiés au lieu de références

en supposant typedef octet unsigned char;

C'est une fonction de compression. Les entrées attendues sont les données d'entrée (transmises comme octet *), la taille des données d'entrée (passées comme int), un pointeur sur la variable dans laquelle stocker la taille compressée (passée comme int *), et une chaîne dans quels messages d'erreur peuvent être stockés si nécessaire (transmis comme char *). La fonction malloc est le tampon de sortie, écrit la sortie, et renvoie un octet *, et le code appelant est censé libérer le tampon quand il est fait en l'utilisant. En cas d'erreur, le message d'erreur est strcpy'd dans la chaîne d'erreur et un pointeur NULL est renvoyé.

Ma configuration actuelle est-elle correcte ou dois-je effectuer d'autres modifications pour qu'elle puisse être appelée depuis .NET?

Répondre

2

Le code managé ne peut pas libérer la mémoire, il n'a pas accès à l'allocateur intégré au CRT. Vous pouvez utiliser CoTaskMemAlloc() pour allouer le tampon à la place, le code managé peut appeler Marshal.FreeCoTaskMem(). Vous devez déclarer l'argument du pointeur de la mémoire tampon comme "ref IntPtr" ou déclarer le type de retour de la fonction comme IntPtr. Ce qui donne au code managé la peine de le convertir en un tableau d'octets géré.

Ce n'est pas joli, ces problèmes disparaissent lorsque vous écrivez le code en C++/CLI ou écrivez un serveur COM.

+0

Oui, C++/CLI est le chemin à parcourir. –

Questions connexes