2017-09-15 3 views
0

Ci-dessous un exemple de jouet pour mieux comprendre le marshaling des types de chaînes entre C# et C++/dll.Marshaling C++ strncpy fonction de dll en C#

Quelle est la meilleure façon de rassembler la fonction "MyStrCopy" ci-dessous dans C#? (De préférence sans utiliser le mot-clé dangereux et par marshaling le type dans et hors de C# comme un type de chaîne.)

fichier: MyStrCopy.cs

using System.Runtime.InteropServices; 

namespace MySpace { 
    class MyDll { 
     [DllImport (@"MyStrCopy")] 
     public static extern void MyStrCopy(
      string dest????, string source????, int dest_length????); 
    } 
} 

DOSSIER: MyStrCopy.h:

extern "C" { 
    void __declspec(dllexport) MyStrCopy(
     char* dest, const char* source, int dest_length); 
} 

dOSSIER: MyStrCopy.cpp

#include <cstring> 
#include "MyStrCopy.h" 

void MyStrCopy(char* dest, const char* source, int dest_len) { 
    strncpy(dest, source, dest_len); 
    dest[dest_len-1] = 0; // zero terminated when source > dest 
} 

je compile le fichier ci-dessus « MyStrCopy.cp p "dans une DLL appelée: MyStrCopy.dll

Je suis aussi un peu curieux de savoir à quoi cela ressemblerait si vous renvoyiez char * aussi bien sous la même préférence de ne pas utiliser de type dangereux et de marshaling à string. Par exemple, si la fonction exportée dll ressemble à ceci:

char* MyStrCopy(char* dest, const char* source, int dest_len) { 
    return strncpy(dest, source, dest_len); 
} 
+0

En utilisant une fonction C qui a été brisé par la conception est très peu sage, strncpy() est vouée à l'échec car il ne garantit pas que ce sera zéro fin la chaîne Cela écrasera le programme C# avec une AccessViolationException non-diagnosticable. Ce jouet va être le gros mal de tête d'un autre programmeur, votant pour fermer. –

+0

C'est un bon point, Ajoutez le suivant strncpy() et cela fonctionne dans tous les cas: dest [dest_len-1] = 0; De toute façon, il suffit de voir un exemple de syntaxe [DllImport] en C# qui vous permet de passer des chaînes à des fonctions comme strncpy() quelles qu'elles soient ... Dans Mon cas, j'essayais vraiment de faire ressortir certaines valeurs de une liste du côté C++ dans le côté C# en utilisant DLL interop. –

Répondre

1
using System.Text; 
using System.Runtime.InteropServices; 

namespace MySpace 
{  
    class MyDll { 
     [DllImport("MyStrCopy.dll", CharSet = CharSet.Ansi)] 
     public static extern void MyStrCopy(
      StringBuilder dst_str, 
      string   src_str, 
      int   dst_len);  

     static void ExampleUsage() { 
      int   dest_len = 100; 
      StringBuilder dest_str = new StringBuilder(dest_len); 
      string  source  = "this is a string"; 
      MyStrCopy(dest_str, source, dest_len); 
      return; 
     }  

    } //class 
} //namespace