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);
}
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. –
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. –