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#?

OriginalL'auteur Treno1 | 2012-09-10