Marshal.SecureStringToCoTaskMemAnsi(SecureString) 메서드

정의

중요

이 API는 CLS 규격이 아닙니다.

관리되는 SecureString 개체의 내용을 관리되지 않는 COM 작업 할당자에서 할당된 메모리 블록으로 복사합니다.Copies the contents of a managed SecureString object to a block of memory allocated from the unmanaged COM task allocator.

public:
 static IntPtr SecureStringToCoTaskMemAnsi(System::Security::SecureString ^ s);
public static IntPtr SecureStringToCoTaskMemAnsi (System.Security.SecureString s);
[System.CLSCompliant(false)]
public static IntPtr SecureStringToCoTaskMemAnsi (System.Security.SecureString s);
[System.Security.SecurityCritical]
public static IntPtr SecureStringToCoTaskMemAnsi (System.Security.SecureString s);
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
[<System.CLSCompliant(false)>]
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
[<System.Security.SecurityCritical>]
static member SecureStringToCoTaskMemAnsi : System.Security.SecureString -> nativeint
Public Shared Function SecureStringToCoTaskMemAnsi (s As SecureString) As IntPtr

매개 변수

s
SecureString

복사할 관리되는 개체입니다.The managed object to copy.

반환

IntPtr

관리되지 않는 메모리에서 s 매개 변수가 복사된 주소 또는 null 개체가 제공된 경우 0입니다.The address, in unmanaged memory, where the s parameter was copied to, or 0 if a null object was supplied.

특성

예외

s 매개 변수가 null인 경우The s parameter is null.

사용 가능한 메모리가 부족한 경우There is insufficient memory available.

예제

다음 예제에서는 메서드를 사용 하 여 SecureStringToCoTaskMemAnsi 개체의 내용을 SecureString 관리 되지 않는 메모리 블록으로 마샬링하고 해독 합니다.The following example uses the SecureStringToCoTaskMemAnsi method to marshal and decrypt the contents of a SecureString object to a block of unmanaged memory. 그런 다음 메서드를 사용 하 여 ZeroFreeCoTaskMemAnsi 관리 되지 않는 블록을 삭제 하 고 삭제 합니다.It then uses the ZeroFreeCoTaskMemAnsi method to zero out and dispose the unmanaged block.

using System;
using System.Runtime.InteropServices;
using System.Security;

class MarshalExample
{
     static void Main()
     {
         IntPtr unmanagedRef = IntPtr.Zero;

          // Ask the user for a password.
          Console.Write("Please enter your password: ");

          SecureString passWord = GetPassword();

          Console.WriteLine("Copying and decrypting the string to unmanaged memory...");

          // Copy the Secure string to unmanaged memory (and decrypt it).
          unmanagedRef = Marshal.SecureStringToCoTaskMemAnsi(passWord);

          if (unmanagedRef != IntPtr.Zero)
          {
              Console.WriteLine("Zeroing out unmanaged memory...");

              Marshal.ZeroFreeCoTaskMemAnsi(unmanagedRef);
          }
          passWord.Dispose();

         Console.WriteLine("Done.");
     }

     public static SecureString GetPassword()
     {
         SecureString password = new SecureString();

         // get the first character of the password
         ConsoleKeyInfo nextKey = Console.ReadKey(true);

         while (nextKey.Key != ConsoleKey.Enter)
         {
             if (nextKey.Key == ConsoleKey.Backspace)
             {
                 if (password.Length > 0)
                 {
                     password.RemoveAt(password.Length - 1);

                     // erase the last * as well
                     Console.Write(nextKey.KeyChar);
                     Console.Write(" ");
                     Console.Write(nextKey.KeyChar);
                 }
             }
             else
             {
                 password.AppendChar(nextKey.KeyChar);
                 Console.Write("*");
             }

             nextKey = Console.ReadKey(true);
         }

         Console.WriteLine();

         // lock the password down
         password.MakeReadOnly();
         return password;
     }
}
Imports System.Runtime.InteropServices
Imports System.Security

Module Example
    Sub Main()
        Dim unmanagedRef As IntPtr

         ' Ask the user for a password.
         Console.Write("Please enter your password: ")
         Dim passWord As SecureString = GetPassword()

         Console.WriteLine("Copying and decrypting the string to unmanaged memory...")

         ' Copy the Secure string to unmanaged memory (and decrypt it).
         unmanagedRef = Marshal.SecureStringToCoTaskMemAnsi(passWord)

         If unmanagedRef <> IntPtr.Size Then
             Console.WriteLine("Zeroing out unmanaged memory...")
             Marshal.ZeroFreeCoTaskMemAnsi(unmanagedRef)
         End If
         passWord.Dispose()

        Console.WriteLine("Done.")
    End Sub



    Function GetPassword() As SecureString
        Dim password As New SecureString()

        ' get the first character of the password
        Dim nextKey As ConsoleKeyInfo = Console.ReadKey(True)

        While nextKey.Key <> ConsoleKey.Enter
            If nextKey.Key = ConsoleKey.BackSpace Then
                If password.Length > 0 Then
                    password.RemoveAt(password.Length - 1)

                    ' erase the last * as well
                    Console.Write(nextKey.KeyChar)
                    Console.Write(" ")
                    Console.Write(nextKey.KeyChar)
                End If
            Else
                password.AppendChar(nextKey.KeyChar)
                Console.Write("*")
            End If

            nextKey = Console.ReadKey(True)
        End While

        Console.WriteLine()

        ' lock the password down
        password.MakeReadOnly()
        Return password

    End Function
End Module

설명

SecureStringToCoTaskMemAnsi메서드는 사용자 지정 마샬링 또는 관리 코드와 비관리 코드를 함께 사용할 때 유용 합니다.The SecureStringToCoTaskMemAnsi method is useful for custom marshaling or when mixing managed and unmanaged code. 이 메서드는 문자열에 필요한 관리 되지 않는 메모리를 할당 하므로 항상를 호출 하 여 메모리를 비웁니다 ZeroFreeCoTaskMemAnsi .Because this method allocates the unmanaged memory required for a string, always free the memory by calling ZeroFreeCoTaskMemAnsi. 문자열의 문자는 ANSI 문자로 복사 됩니다.The characters of the string are copied as ANSI characters.

적용 대상