public static unsafe string CertGetNameString( SafeCertContextHandle certContext, Interop.Crypt32.CertNameType certNameType, Interop.Crypt32.CertNameFlags certNameFlags, Interop.Crypt32.CertNameStringType strType) { int cchCount = Crypt32.CertGetNameString(certContext, certNameType, certNameFlags, strType, null, 0); if (cchCount == 0) { throw Marshal.GetLastWin32Error().ToCryptographicException(); } Span <char> buffer = cchCount <= 256 ? stackalloc char[cchCount] : new char[cchCount]; fixed(char *ptr = &MemoryMarshal.GetReference(buffer)) { if (Crypt32.CertGetNameString(certContext, certNameType, certNameFlags, strType, ptr, cchCount) == 0) { throw Marshal.GetLastWin32Error().ToCryptographicException(); } Debug.Assert(buffer[cchCount - 1] == '\0'); return(new string(buffer.Slice(0, cchCount - 1))); } }