LINQ和Clipboard安全性的问题

时间:2011-09-17 12:39:03

标签: c# silverlight linq clipboard

为什么我需要在LINQ查询上调用ToList()方法?

例如:

private void btnEnc_Click(object sender, RoutedEventArgs e)
{
    SHA1 sha = new SHA1Managed();
    string sResult = "";

    var v = sha.ComputeHash(
        UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text)
        ).Select(
            p => sResult += string.Format("{0:x2}", p)
        ).ToList();

    Clipboard.SetText(sResult);

    tbxEncrypted.Text = sResult;
}

此外,当我尝试访问剪贴板时,我得到一个安全对话框。我该如何防止这种情况?

SilverLight ClipBoard Access MessageBox

3 个答案:

答案 0 :(得分:5)

默认情况下,您在部分信任下运行。当调用ClipBoard.SetText()(或ClipBoard.SetText(...))时,用户必须确认访问。

如果您创建了一个浏览器外应用程序并请求提升信任,则此限制将不再适用,并且不会显示任何对话框。

您可以将应用程序配置为需要提升信任度。您需要在应用程序的清单中设置它。

有关详细信息,请查看MSDN:

http://msdn.microsoft.com/en-us/library/ee721083(v=vs.95).aspx

  1. 打开项目的属性并导航到Silverlight选项卡。
  2. 选中“启用浏览器运行应用程序”选项。
  3. 单击“浏览器外设置”按钮。将弹出一个新对话框。
  4. 选中“在浏览器外部运行时需要提升信任”选项。
  5. 当用户安装Silverlight应用程序时,他们将获得安全警告,然后才能继续。这只发生过一次。以这种方式运行应用程序时,ClipBoard.SetText()调用将不再触发安全对话框。

答案 1 :(得分:4)

您需要调用list的原因是因为在评估LINQ语句创建的表达式之前,不会评估Select中的表达式。因为您正在使用它附加到sResult,所以除非您使用ToList()“运行”LINQ表达式,否则在将变量放入剪贴板之前,该变量的值不会更改。请注意,ToList()的输出基本上没有价值。

更大的问题是你误用了Select。你真的应该使用string.Join而不是在Select子句中构建字符串。在Select子句中构建它对于阅读代码并且难以理解的人来说意外。

var sResult = string.Join( "",
                 sha.ComputeHash(
                       UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text)
                 ).Select(
                       p => string.Format("{0:x2}", p)
                 ));

答案 2 :(得分:0)

至于Linq:

如果您希望imediatly评估数据,您只需要致电ToList()

大多数Linq运算符都是lazy的设计,这是一件好事。