CryptUnprotectData Windows API 関数と .net SecureString を可能な限り最善の方法で結び付けたいと考えています。CryptUnprotectData は、バイト配列とバイト長で構成される DATA_BLOB 構造を返します。私のプログラムでは、これは Unicode UTF-16 文字列になります。SecureString には、char* と長さのパラメーターを受け取るコンストラクターがあるため、次のようなことができるようにしたいと考えています。
SecureString ss = SecureString((char*)textBlob.pbData, textBlob.cbData / 2);
これは機能しますが、UTF-16 が可変長であることを除けば、長さの引数として何を使用すればよいかわかりません。上記の例では 2 バイト文字 (BMP) を想定していますが、他のプレーンでは最大 4 バイトになる可能性があります。バイト配列内の UTF-16 文字の数を知る必要があります。値をメモリ内にコピーせずにこれを行う最善の方法は何ですか (それによってセキュリティが損なわれます)。できるだけ早くバイト配列をゼロにして解放する予定です。