Marshal.SecureStringToCoTaskMemAnsi(SecureString) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重要
此 API 不符合 CLS。
将托管 SecureString 对象的内容复制到从非托管 COM 任务分配器分配的内存块。
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
参数
要复制的托管对象。
返回
IntPtr
nativeint
非托管内存中将 s
参数复制到的地址;如果提供了 null 对象,则为 0。
- 属性
例外
s
参数为 null
。
没有足够的可用内存。
示例
以下示例使用 SecureStringToCoTaskMemAnsi 方法将对象的内容 SecureString 封送和解密到非托管内存块。 然后, ZeroFreeCoTaskMemAnsi 它使用 方法对非托管块进行归零并释放。
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 可用于自定义封送处理或混合托管和非托管代码。 由于此方法分配字符串所需的非托管内存,因此请始终通过调用 ZeroFreeCoTaskMemAnsi释放内存。 字符串的字符将复制为 ANSI 字符。