Freigeben über


Marshal.StringToHGlobalAnsi(String) Methode

Definition

Kopiert den Inhalt eines verwalteten String in den nicht verwalteten Speicher und konvertiert ihn beim Kopieren in das ANSI-Format.

public:
 static IntPtr StringToHGlobalAnsi(System::String ^ s);
[System.Security.SecurityCritical]
public static IntPtr StringToHGlobalAnsi (string s);
public static IntPtr StringToHGlobalAnsi (string? s);
public static IntPtr StringToHGlobalAnsi (string s);
[<System.Security.SecurityCritical>]
static member StringToHGlobalAnsi : string -> nativeint
static member StringToHGlobalAnsi : string -> nativeint
Public Shared Function StringToHGlobalAnsi (s As String) As IntPtr

Parameter

s
String

Eine zu kopierende verwaltete Zeichenfolge.

Gibt zurück

IntPtr

nativeint

Die Adresse im nicht verwalteten Arbeitsspeicher, an die s kopiert wurde, oder 0, wenn s gleich null ist.

Attribute

Ausnahmen

Es ist nicht genügend Arbeitsspeicher verfügbar.

Der s-Parameter übersteigt die vom Betriebssystem zugelassene maximale Länge.

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie sie den Inhalt einer verwalteten String Klasse in nicht verwalteten Arbeitsspeicher konvertieren und anschließend den nicht verwalteten Arbeitsspeicher entsorgen.

using namespace System;
using namespace System::Runtime::InteropServices;

#include <iostream>                                                 // for printf


int main()
{
    // Create a managed string.
    String^ managedString = "Hello unmanaged world (from the managed world).";

    // Marshal the managed string to unmanaged memory.
    char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();

    printf("stringPointer = %s\n", stringPointer);

    // Always free the unmanaged string.
    Marshal::FreeHGlobal(IntPtr(stringPointer));

    return 0;
}
using System;
using System.Runtime.InteropServices;
using System.Threading;

class MainFunction
{
    static void Main()
    {
        Console.WriteLine("\nStringToGlobalAnsi\n");

        // Create a managed string.
        String  managedString = "I am a managed String";
        Console.WriteLine("1) managedString = " + managedString);

        // Marshal the managed string to unmanaged memory.
        IntPtr stringPointer = (IntPtr)Marshal.StringToHGlobalAnsi(managedString);
        Console.WriteLine("2) stringPointer = {0}", stringPointer);

        // Get the string back from unmanaged memory.
        String RetrievedString = Marshal.PtrToStringAnsi(stringPointer);
        Console.WriteLine("3) Retrieved from unmanaged memory = " + RetrievedString);

        // Always free the unmanaged string.
        Marshal.FreeHGlobal(stringPointer);

        // IntPtr handle value is still the same:
        Console.WriteLine("4) stringPointer = " + stringPointer);

        // However, the data may be cleared after the memory is freed, depending on whether the memory allocated to stringPointer
        // has been reclaimed or not. Uncommenting the following line (Thread.Sleep(1000)) increases the likelihood of the memory being reclaimed.
        // Thread.Sleep(1000);
        String RetrievedString2 = Marshal.PtrToStringAnsi(stringPointer);
        Console.WriteLine("5) RetrievedString2 = " + RetrievedString2);
    }
}

Hinweise

StringToHGlobalAnsi ist nützlich für benutzerdefiniertes Marshalling oder beim Mischen von verwaltetem und nicht verwaltetem Code. Da diese Methode den nicht verwalteten Arbeitsspeicher zuweist, der für eine Zeichenfolge erforderlich ist, geben Sie immer den Arbeitsspeicher frei, indem Sie aufrufen FreeHGlobal. StringToHGlobalAnsi stellt die entgegengesetzte Funktionalität von bereit Marshal.PtrToStringAnsi.

Diese Methode kopiert eingebettete NULL-Zeichen und enthält ein beendendes NULL-Zeichen.

Gilt für:

Weitere Informationen