Как использовать небезопасный код в безопасном контексте?

Мне нужно использовать SecureString для класса Microsoft, и я нашел следующий код на интернет:

public static class SecureStringExt
{
    public static SecureString ConvertToSecureString(this string password)
    {
        if (password == null)
            throw new ArgumentNullException("password");

        unsafe //Red highlighted line
        {
            fixed (char* passwordChars = password)
            {
                var securePassword = new SecureString(passwordChars, password.Length);
                securePassword.MakeReadOnly();
                return securePassword;
            }
        }
    }
}

Единственная проблема заключается в том, что ключевое слово unsafe продолжает выдавать мне ошибку, говорящую Cannot use unsafe construct in safe context. К сожалению, я не мог найти, почему это происходит...

Примечание. Приведенный выше код работает в LINQPad, но не в VS2013 (с resharper).


person CodeArtist    schedule 20.09.2014    source источник
comment
Я не понимаю, почему вам нужно использовать unsafe здесь, вы создаете безопасную строку без небезопасного кода. Проверьте мой ответ.   -  person mybirthname    schedule 21.09.2014
comment
В документации сказано, что вы не должны использовать этот конструктор. См. msdn.microsoft.com/en-us/ library/176bafkd(v=vs.110).aspx Используйте код, который @mybirthname дал в своем ответе   -  person MicroVirus    schedule 21.09.2014


Ответы (2)


Я не уверен, что в этом случае вам нужен небезопасный код (см. ответ @mybirthname).

Но когда требуется небезопасный код, его можно включить в свойствах проекта.

  • В главном меню нажмите Project, а затем <ProjectName> properties...
  • Нажмите на страницу Build.
  • Выберите Allow unsafe code.

Разрешить небезопасный код

Или можно явно указать параметр компилятора /unsafe.

person AlexD    schedule 20.09.2014
comment
Можно ли это декларировать? - person jww; 21.09.2014
comment
@jww Что ты имеешь в виду? - person AlexD; 21.09.2014
comment
С помощью атрибутов. Что-то вроде декларативной безопасности. Кажется, лучше отключать его по мере необходимости, а не отключать везде. - person jww; 21.09.2014
comment
@jww Я полностью согласен с тем, что включение небезопасной компиляции следует свести к минимуму. Однако я сомневаюсь, что атрибуты помогут с unsafe {...}. Компилятор дает error CS0227: Unsafe code may only appear if compiling with /unsafe. Если у вас есть идея, как это сделать, дайте мне знать, пожалуйста. - person AlexD; 21.09.2014
comment
это я и спрашивал :) - person jww; 21.09.2014

    public static SecureString GetSecureString(string password)
    {
        SecureString secureString = new SecureString();

        foreach (char c in password)
        {
            secureString.AppendChar(c);
        }

        secureString.MakeReadOnly();
        return secureString;
    }

Вы можете сделать то же самое без небезопасного кода.

person mybirthname    schedule 20.09.2014