Marshal.StringToHGlobalAnsi(String) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Kopiert den Inhalt eines verwalteten String Speichers in nicht verwalteten Speicher, und wandelt beim Kopieren in das ANSI-Format um.
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 verwaltete Zeichenfolge, die kopiert werden soll.
Gibt zurück
nativeint
Die Adresse im nicht verwalteten Speicher an die Stelle, an die s kopiert wurde, oder 0( falls s vorhanden).null
- Attribute
Ausnahmen
Es ist nicht genügend Arbeitsspeicher verfügbar.
Der s Parameter überschreitet die maximal zulässige Länge des Betriebssystems.
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie der Inhalt einer verwalteten String-Klasse in nicht verwalteten Speicher konvertiert und anschließend den nicht verwalteten Speicher verworfen wird.
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 das benutzerdefinierte Marshalling oder beim Mischen von verwaltetem und nicht verwaltetem Code. Da diese Methode den nicht verwalteten Speicher zuweist, der für eine Zeichenfolge erforderlich ist, geben Sie immer den Speicher frei, indem Sie den Aufruf aufrufen FreeHGlobal. StringToHGlobalAnsi bietet die entgegengesetzte Funktionalität von Marshal.PtrToStringAnsi.
Diese Methode kopiert eingebettete NULL-Zeichen und enthält ein endendes NULL-Zeichen.