lima-city: Webhosting, Domains und Cloud
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 (628 Punkte)  
Diese Community basiert auf dem Prinzip der Selbstregulierung. Beiträge werden von Nutzern erstellt, bewertet und verbessert – ganz ohne zentrale Moderation.

Wer hilfreiche Fragen stellt oder gute Antworten gibt, sammelt Punkte. Mit steigender Punktzahl erhalten Mitglieder automatisch mehr Rechte, zum Beispiel

  • Kommentare verfassen
  • Fragen und Antworten bewerten
  • Themen von Fragen bearbeiten
  • Fragen, Antworten und Kommentare bearbeiten
  • Inhalte ausblenden

So entsteht eine Plattform, auf der sich Qualität durchsetzt – getragen von einer engagierten Gemeinschaft.

2.3k Fragen

2.8k Antworten

261 Kommentare

13 Nutzer