DllImport et char Marshaling
Je suis débutant en C# et des gares. J'ai besoin d'utiliser mon C func en C#, mais j'ai une mauvaise valeur de retour à partir de C func (ou je ne sais pas comment faire pour le convertir à la réponse correcte).
C source:
#include "main.h"
char *Ololo(char *arg, int &n3)
{
char *szRet;
szRet=(char*)malloc(strlen(arg)+1);
strcpy(szRet,arg);
n3 = strlen(szRet);
return szRet;
}
D'en-tête C:
extern "C" __declspec(dllexport) char *Ololo(char *arg, int &n3);
C# source:
class Program
{
[DllImport(@"F:\Projects\service\dll\testDLL2.DLL", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern IntPtr Ololo([In] char[] arg, ref Int32 n3);
static void Main(string[] args)
{
string n1 = "ololo";
char[] chars = new char[n1.Length];
chars = n1.ToCharArray();
Int32 n3 = 0;
IntPtr result;
result = Ololo(chars, ref n3);
string n4 = Marshal.PtrToStringUni(result,n3);
Console.WriteLine(n4);
}
}
J'ai retourner quelque chose comme "o?? ?"
Désolé pour les mauvais en anglais
----------------------Résolu-----------------------
class Program
{
[DllImport(@"F:\Projects\service\dll\testDLL2.DLL", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern IntPtr Ololo([MarshalAs(UnmanagedType.LPStr)]string arg, ref Int32 n3);
static void Main(string[] args)
{
string n1 = "ololo";
Int32 n3 = 0;
int n2 = n1.Length;
IntPtr result;
result = Ololo(n1, ref n3);
string n4 = Marshal.PtrToStringAnsi(result, n3);
Console.WriteLine(n4);
}
}
Qui fonctionne très bien. En n3, j'ai eu 5 et n4 ololo! Merci s pour des réponses rapides!
btw 'int &n3' est pas C, C++ notation.
Vous n'avez pas résolu quoi que ce soit, le code des fuites de mémoire pour la chaîne.
double possible de Char * ordonnancement en C#
Passant Il y a une différence: Sur votre lien func qui retour char * a été entièrement réécrites à void func. En fait ma question première est de savoir comment attraper return(char ). Et si il y a fuite de mémoire, comment le retour est gratuit(char) en c#?
Vous n'avez pas résolu quoi que ce soit, le code des fuites de mémoire pour la chaîne.
double possible de Char * ordonnancement en C#
Passant Il y a une différence: Sur votre lien func qui retour char * a été entièrement réécrites à void func. En fait ma question première est de savoir comment attraper return(char ). Et si il y a fuite de mémoire, comment le retour est gratuit(char) en c#?
OriginalL'auteur Treno1 | 2012-09-10
Vous devez vous connecter pour publier un commentaire.
public static extern IntPtr Ololo([In] char[] arg, ref Int32 n3);
IntPtr
est le mauvais type de retour, en substance, comme vous voulez retourner à la chaîne, pas un pointeur vers la chaîne. En C, vous pouvez utiliser un pointeur de votre chaîne à l'aide dechar*
, soit l'équivalent .NET serait d'utiliser ceci:[MarshalAs(UnmanagedType.LPStr)]string
. Cela devrait marshall lachar*
à unstring
correctement.IntPtr
représente un type de pointeur, qui pour obtenir votre chaîne réelle est inutile.Dirait aussi que vous devez prendre
StringBuilder
dans votre Mobilisé la fonction, et non pas unchar[]
. Puis au moins vous devriez être en train de la chaîne correcte de votre fonction C.IntPtr
est correct parce quen3
me renvoie 1 et intIntPtr
jeve got first letter (o). But why I have
n3` = 1? Je pense qu'il a besoins to be 5. Because of that I think
[En] char[] arg " est incorrecte. Mais qu'en est-il correct?Voir mon édité répondre
votre fonction .NET ne sera jamais vous donner toute la chaîne de retour si vous retournez
IntPtr
.Système.AccessViolationException si j'essaie de
public static extern StringBuilder Ololo(string arg, ref Int32 n3);
etStringBuilder n5 = Ololo(n1, ref n3);
Merci! Résolu! Up!
OriginalL'auteur Tony The Lion
Le marshaller n'est pas NULL mettre fin à
char
tableaux pour funsies. Il va le faire parce que vous lui avez dit à si vous lui avez dit. Vous avez de la chance parce qu'unchar
.NET est UTF-16, et c'est de 16 bits de large - et le deuxième octet à zéro parce que c'est'o'
en UTF-16, et donc de donner un strlen de 1. L'effort réel pour passer dans une chaîne terminée par null chaîne C est un peu plus élevé que vous semblez apprécier. Afin de laisser le marshaller faire tout le travail - qu'il sait déjà faire ce travail.public static extern [MarshalAs(UnmanagedType.LPStr)]string Ololo
est incorrect en raison de[MarshalAs(UnmanagedType.LPStr)] cannot be in declaration of class , structure or interface
.Il n'est pas. Vous devez n'ont pas réussi à copier l'attribut DLLImport plus, ou placé à la déclaration dans le mauvais endroit.
Merci! Résolu! Up!
OriginalL'auteur Puppy