Marshal.SecureStringToCoTaskMemUnicode メソッド
アセンブリ: mscorlib (mscorlib.dll 内)

Dim s As SecureString Dim returnValue As IntPtr returnValue = Marshal.SecureStringToCoTaskMemUnicode(s)
戻り値
s パラメータのコピー先となったアンマネージ メモリ内のアドレス。null SecureString オブジェクトが提供された場合は 0。


SecureStringToCoTaskMemUnicode メソッドは、カスタム マーシャリングを実行する場合、またはマネージ コードとアンマネージ コードを混在させる場合に役立ちます。このメソッドは文字列で必要とされるアンマネージ メモリを割り当てるため、必ず ZeroFreeCoTaskMemUnicode メソッドを呼び出してメモリを解放してください。文字列の文字は、Unicode 文字としてコピーされます。
![]() |
---|
このメソッドは SecurityAction.LinkDemand を使用して、信頼関係のないコードからの呼び出しを防ぎます。SecurityPermissionAttribute.UnmanagedCode アクセス許可は、直前の呼び出し元にのみ要求されます。信頼性が一部しか確認されていないコードから呼び出すことができるコードの場合、ユーザー入力を検証せずに Marshal クラスに渡すことは避けてください。LinkDemand メンバの使用に関する重要な制約事項については、「Demand と LinkDemand」を参照してください。 |

SecureStringToCoTaskMemUnicode メソッドを使用して、SecureString オブジェクトの内容をアンマネージ メモリ ブロックにマーシャリングし、復号化するコード例を次に示します。このコード例では、次に ZeroFreeCoTaskMemUnicode メソッドを使用して、アンマネージ ブロックを消去し破棄します。
Imports System Imports System.Diagnostics Imports System.Runtime.InteropServices Imports System.Security Imports System.Security.Principal Imports System.Text Module MarshalExample Sub Main(ByVal args() As String) Dim unmanagedRef As IntPtr Try ' 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.SecureStringToCoTaskMemUnicode(passWord) Catch e As Exception Console.WriteLine(e.Message) Finally If unmanagedRef <> IntPtr.Size Then Console.WriteLine("Zeroing out unmanaged memory...") Marshal.ZeroFreeCoTaskMemUnicode(unmanagedRef) End If End Try Console.WriteLine("Done.") Console.ReadLine() 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
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.SecureStringToCoTaskMemUnicode(passWord); } catch (Exception e) { Console.WriteLine(e.Message); } finally { if (unmanagedRef != IntPtr.Zero) { Console.WriteLine("Zeroing out unmanaged memory..."); Marshal.ZeroFreeCoTaskMemUnicode(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; } } }

- SecurityPermission (アンマネージ コードを呼び出すために必要なアクセス許可)。 UnmanagedCode (関連する列挙体)。LinkDemand (セキュリティ アクション)。

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- Marshal.SecureStringToCoTaskMemUnicode メソッドのページへのリンク