3 Pluspunkte 0 Minuspunkte

Ich habe diese Funktion in C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

__declspec(dllexport) char* HelloWorld() {
    char* str = (char*)malloc(20);
    strcpy(str, "Hello world");
    return str;
}

und möchte sie in C# aufrufen.

using System;
using System.Runtime.InteropServices;

class Program
{

    [DllImport("example.dll")]
    public static extern string HelloWorld();

    public static void Main(string[] args)
    {
        string result = HelloWorld();
        Console.WriteLine("Ausgabe: " + result );
    }
}

Aber es kommt keine Ausgabe.

bezieht sich auf eine Antwort auf: C Library laden in C#
von  

1 Antwort

2 Pluspunkte 0 Minuspunkte

Unmanaged Code und vor allem Zeichenketten werden in der Regel als intPtr (Zeiger auf einen Integer) behandelt. Hier habe ich Marshal.PtrToStringAnsi verwendet, um den Zeiger auf den Zeichenfolgenpuffer in eine .NET-Zeichenfolge umzuwandeln. Beachte, dass FreeCoTaskMem verwendet wird, um den allokierten Speicher freizugeben.

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr HelloWorld();

IntPtr resultPtr = HelloWorld();
string result = Marshal.PtrToStringAnsi(resultPtr);
Console.WriteLine(result);
Marshal.FreeCoTaskMem(resultPtr);
von (732 Punkte)