SecureStringToGlobalAllocAnsi .NetCLR
Попытка скомпилировать этот код с помощью Dnx CoreCLR
passValue = new byte[pass.Length];
GCHandle gch = GCHandle.Alloc(pinValue, GCHandleType.Pinned);
ptr = Marshal.SecureStringToGlobalAllocAnsi(pass); //Here NET CLR
Marshal.Copy(ptr, passValue, 0, passValue.Length);
passValueLen = Convert.ToUInt32(passValue.Length);
Я получаю эту ошибку
CS0117: "Маршал" не содержит определения для "SecureStringToGlobalAllocAnsi"
Я уверен, что существует обходной путь для безопасной строки в ядре CLR.
1 ответ
Ответ часто в источнике
Поскольку Microsoft открыла исходный код.NET Framework, теперь довольно легко и законно взглянуть на реализацию каждого класса и получить любую полезную информацию.
- Источники CLR, который включает в себя mscorlib и VM
- Источники BCL, которые еще могут быть загружены не полностью
Из этого вы можете найти, что Marshal.SecureStringToGlobalAllocAnsi(pass)
более или менее призыв к SecureString.ToAnsiStr
,
SecureString
является частью пространства имен System.Security и в mscorlib.dll
Примечание. Некоторые методы.NET Framework не предназначены для работы вне среды Win32, особенно те, которые полагаются на Interop, COM, внешние вызовы VM. Из документации видно, что
.NET Core 5 - это модульная реализация среды выполнения и библиотеки, включающая подмножество.NET Framework
Таким образом, может работать только подмножество функций каркаса. Однако вы также можете запустить DNX на Mono. В случае, если вы пытаетесь запустить код в Unix или среде Android, вам следует попробовать Mono, потому что они немного опережают в плане поддерживаемых функций на этих платформах.
DNX был удален, как указано здесь, и теперь вы должны использовать CLI.
Вот выдержка из securestring.cs
[System.Security.SecurityCritical] // auto-generated
[MethodImplAttribute(MethodImplOptions.Synchronized)]
#if FEATURE_CORRUPTING_EXCEPTIONS
[HandleProcessCorruptedStateExceptions]
#endif // FEATURE_CORRUPTING_EXCEPTIONS
internal unsafe IntPtr ToAnsiStr(bool allocateFromHeap) {
EnsureNotDisposed();
IntPtr ptr = IntPtr.Zero;
IntPtr result = IntPtr.Zero;
int byteCount = 0;
RuntimeHelpers.PrepareConstrainedRegions();
try {
// GetAnsiByteCount uses the string data, so the calculation must happen after we are decrypted.
UnProtectMemory();
// allocating an extra char for terminating zero
byteCount = GetAnsiByteCount() + 1;
RuntimeHelpers.PrepareConstrainedRegions();
try {
}
finally {
if( allocateFromHeap) {
ptr = Marshal.AllocHGlobal(byteCount);
}
else {
ptr = Marshal.AllocCoTaskMem(byteCount);
}
}
if (ptr == IntPtr.Zero) {
throw new OutOfMemoryException();
}
GetAnsiBytes((byte *)ptr.ToPointer(), byteCount);
result = ptr;
}
catch (Exception) {
ProtectMemory();
throw;
}
finally {
ProtectMemory();
if( result == IntPtr.Zero) {
// If we failed for any reason, free the new buffer
if (ptr != IntPtr.Zero) {
Win32Native.ZeroMemory(ptr, (UIntPtr)byteCount);
if( allocateFromHeap) {
Marshal.FreeHGlobal(ptr);
}
else {
Marshal.FreeCoTaskMem(ptr);
}
}
}
}
return result;
}