Marshal.SecureStringToCoTaskMemUnicode(SecureString) メソッド

定義

重要

この API は CLS 準拠ではありません。

アンマネージド COM タスク アロケーターから割り当てられたメモリ ブロックに、マネージド SecureString オブジェクトの内容をコピーします。

C#
public static IntPtr SecureStringToCoTaskMemUnicode(System.Security.SecureString s);
C#
[System.CLSCompliant(false)]
public static IntPtr SecureStringToCoTaskMemUnicode(System.Security.SecureString s);
C#
[System.Security.SecurityCritical]
public static IntPtr SecureStringToCoTaskMemUnicode(System.Security.SecureString s);

パラメーター

s
SecureString

コピーするマネージド オブジェクト。

戻り値

IntPtr

s パラメーターのコピー先となったアンマネージ メモリ内のアドレス。null オブジェクトが指定された場合は 0。

属性

例外

s パラメーターが null です。

使用できるメモリが不足しています。

次の例では、 メソッドを SecureStringToCoTaskMemUnicode 使用して、オブジェクトの内容をアンマネージド メモリの SecureString ブロックにマーシャリングおよび復号化します。 次に、 メソッドを ZeroFreeCoTaskMemUnicode 使用して、アンマネージド ブロックをゼロにして破棄します。

C#
using System;
using System.Runtime.InteropServices;
using System.Security;

class Example
{
    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.SecureStringToCoTaskMemUnicode(passWord);
        passWord.Dispose();

        if (unmanagedRef != IntPtr.Zero) {
            Console.WriteLine("Zeroing out unmanaged memory...");
            Marshal.ZeroFreeCoTaskMemUnicode(unmanagedRef);
        }
        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;
     }
 }
// The example displays output like the following:
//       Please enter your password: **********
//       Copying and decrypting the string to unmanaged memory...
//       Zeroing out unmanaged memory...
//       Done.

注釈

メソッドは SecureStringToCoTaskMemUnicode 、カスタム マーシャリングや、マネージド コードとアンマネージド コードを混在させる場合に便利です。 このメソッドは文字列に必要なアンマネージ メモリを割り当てるので、 メソッドを呼び出してメモリを ZeroFreeCoTaskMemUnicode 解放します。 文字列の文字は Unicode 文字としてコピーされます。

適用対象

製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1