Проблемы с безопасностью LINQ и буфера обмена - PullRequest
0 голосов
/ 17 сентября 2011

Зачем мне вызывать метод ToList () в моем запросе LINQ?

Например:

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 ]

5 голосов
/ 17 сентября 2011

По умолчанию вы работаете с частичным доверием.При вызове ClipBoard.SetText () (или ClipBoard.SetText (...)) пользователь должен подтвердить доступ.

Если вы создаете приложение вне браузера и запрашиваете повышенное доверие, это ограничение больше не применяетсяи диалоговое окно не отображается.

Вы можете настроить приложение так, чтобы оно требовало повышенного доверия.Вы должны установить это в манифесте приложения.

Для получения дополнительной информации посмотрите MSDN:

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

  1. Откройте свойства вашего проекта и перейдите на вкладку Silverlight.
  2. Установите флажок «Включить запуск приложения из браузера».
  3. Нажмите на кнопку «Настройки вне браузера».Появится новое диалоговое окно.
  4. Установите флажок «Требовать повышенное доверие при работе вне браузера».

Когда пользователь устанавливает приложение Silverlight, он получит предупреждение безопасности, прежде чем онможно продолжить.Это происходит только один раз.При запуске приложения таким способом вызов ClipBoard.SetText () больше не будет вызывать диалоговое окно безопасности.

4 голосов
/ 17 сентября 2011

Причина, по которой вам нужно обратиться к списку, заключается в том, что выражение внутри Select не оценивается, пока не будет оценено выражение, созданное оператором LINQ. Поскольку вы используете его для добавления к sResult, значение этой переменной не изменится до того, как вы поместите ее в буфер обмена, если вы не «запустите» выражение LINQ с помощью ToList (). Обратите внимание, что вывод ToList () в основном бесполезен.

Большая проблема в том, что вы неправильно используете Select. Вы действительно должны использовать string.Join вместо построения строки внутри предложения Select. Построение его внутри предложения Select будет неожиданным для людей, читающих ваш код, и труднее для понимания.

var sResult = string.Join( "",
                 sha.ComputeHash(
                       UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text)
                 ).Select(
                       p => string.Format("{0:x2}", p)
                 ));
0 голосов
/ 17 сентября 2011

Что касается Linq:

Вам нужно позвонить ToList(), только если вы хотите, чтобы данные оценивались немедленно.

Большинство операторов Linq ленивы по своей конструкции, и это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...