public static void SecureStringMarshal_Ansi_Roundtrip(int length, bool allocHGlobal)
{
string input = new string(Enumerable
.Range(0, length)
.Select(i => (char)('a' + i)) // include non-ASCII chars
.ToArray());
IntPtr marshaledString = Marshal.StringToHGlobalAnsi(input);
string expectedAnsi = Marshal.PtrToStringAnsi(marshaledString);
Marshal.FreeHGlobal(marshaledString);
using (SecureString ss = CreateSecureString(input))
{
IntPtr marshaledSecureString = allocHGlobal ?
SecureStringMarshal.SecureStringToGlobalAllocAnsi(ss) :
SecureStringMarshal.SecureStringToCoTaskMemAnsi(ss);
string actualAnsi = Marshal.PtrToStringAnsi(marshaledSecureString);
if (allocHGlobal)
{
Marshal.FreeHGlobal(marshaledSecureString);
}
else
{
Marshal.FreeCoTaskMem(marshaledSecureString);
}
Assert.Equal(expectedAnsi, actualAnsi);
}
}