如何在安全的环境中使用不安全的代码?

34

我需要为Microsoft的一个类使用SecureString,并在互联网上找到了以下代码:

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中运行正常,但在带有resharper的VS2013中无法运行。


6
我不明白为什么您需要在这里使用不安全的代码,您可以在不使用不安全代码的情况下创建安全字符串。请检查我的回答。 - mybirthname
3
文档说明你不应该使用那个构造函数。请参阅http://msdn.microsoft.com/en-us/library/176bafkd(v=vs.110).aspx,使用@mybirthname在他的答案中提供的代码。 - MicroVirus
2个回答

70

我不确定那种情况下是否需要不安全的代码(请参见 @mybirthname 的答案)。

但是当需要使用不安全的代码时,可以在项目属性中启用它。

  • 在主菜单中,点击 Project ,然后点击 <ProjectName> properties...
  • 点击 Build 页面。
  • 选择 Allow unsafe code

允许不安全代码

或者可以显式指定编译器选项 /unsafe


可以声明吗? - jww
@jww 你的意思是什么? - AlexD
通过使用属性,例如声明性安全,最好是根据需要关闭它,而不是在所有地方都关闭它。 - jww
1
@jww 我完全同意尽量减少启用不安全编译。但是我怀疑属性是否能帮助 unsafe {...}。编译器会给出 error CS0227: Unsafe code may only appear if compiling with /unsafe 的错误提示。如果你有想法,请告诉我。 - AlexD
这就是我所问的 :) - jww

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

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

        secureString.MakeReadOnly();
        return secureString;
    }

你可以不使用不安全的代码来完成同样的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接