이 설명서는 보관되지만 유지 되지 않습니다.

Marshal.ZeroFreeCoTaskMemAnsi 메서드

업데이트: 2007년 11월

SecureStringToCoTaskMemAnsi 메서드를 사용하여 할당한 관리되지 않는 문자열 포인터를 해제합니다.

네임스페이스:  System.Runtime.InteropServices
어셈블리:  mscorlib(mscorlib.dll)

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void ZeroFreeCoTaskMemAnsi(
	IntPtr s
)
/** @attribute SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode) */
public static void ZeroFreeCoTaskMemAnsi(
	IntPtr s
)
public static function ZeroFreeCoTaskMemAnsi(
	s : IntPtr
)

매개 변수

s
형식: System.IntPtr

해제할 관리되지 않는 문자열의 주소입니다.

ZeroFreeCoTaskMemAnsi 메서드는 먼저 SecureStringToCoTaskMemAnsi 메서드를 사용하여 할당된 관리되지 않는 메모리를 비운 다음 해제합니다.

참고:

이 메서드는 신뢰할 수 없는 코드에서 호출되지 않도록 SecurityAction.LinkDemand를 사용합니다. 따라서 직접 실행 호출자만 SecurityPermissionAttribute.UnmanagedCode 권한을 가져야 합니다. 부분적으로 신뢰할 수 있는 코드에서 특정 코드를 호출하는 경우 유효성 검사 없이 사용자 입력을 Marshal 클래스 메서드로 전달하지 마십시오. LinkDemand 멤버 사용에 대한 중요한 제한 사항은 Demand와 LinkDemand 비교를 참조하십시오.

다음 코드 예제에서는 SecureStringToCoTaskMemAnsi 메서드를 사용하여 SecureString 개체의 내용을 관리되지 않는 메모리 블록으로 마샬링하고 암호 해독합니다. 그런 다음 ZeroFreeCoTaskMemAnsi 메서드를 사용하여 관리되지 않는 블록을 비우고 삭제합니다.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Principal;
using System.Text;

namespace SecureStringExample
{

    class MarshalExample
    {


        static void Main(string[] args)
        {
            IntPtr unmanagedRef = IntPtr.Zero;

            try
            {
                // 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);


            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (unmanagedRef != IntPtr.Zero)
                {
                    Console.WriteLine("Zeroing out unmanaged memory...");

                    Marshal.ZeroFreeCoTaskMemAnsi(unmanagedRef);
                }

            }

            Console.WriteLine("Done.");

            Console.ReadLine();


        }

        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;
        }
    }
}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework 및 .NET Compact Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

.NET Framework

3.5, 3.0, 2.0에서 지원
표시: