Насколько я знаю, большая часть Windows API имеет дело с кодовыми точками UTF-16 - другими словами, вы рассматриваете суррогатные пары как две кодовые точки вместо одного символа. Учитывая, что конструктор для SecureString имеет дело с указателем на значения .NET System.Char
(которые являются UTF-16), я думаю, что у вас есть хороший фрагмент кода - количество элементов в pbData равно половина его размера в байтах.
Например, если pbData
содержит (только) суррогатную пару, cbData
будет 4, и вы все равно захотите передать 2 в качестве второго аргумента - потому что это число System.Char
значений, которые вы построение SecureString
из. Тот факт, что это один не-BMP символ Unicode, не имеет отношения к числу значений UTF-16 System.Char
, в которых он представлен.
(И да, поддержка данных, не относящихся к BMP, немного беспорядочная, и я подозреваю, что очень немногие понимают ее везде. Я уверен, что нет. К счастью, во многих местах вам не нужно волноваться ...)