понедельник, марта 07, 2011

Хвала Reflection.

Потребовалось в проекте выгружать на диск документы из библиотек Шарепойнт. На первый взгляд – ничего особенного: запрашиваем у пользователя путь к папке сохранения на манер модуля резервного копирования в Центре Управления, подключаем пространство имён System.IO, класс DirectoryInfo, методы CreateSubdirectory, file.OpenBinary() + stream.Write() – и все дела. На второй взгляд – тоже просто: примеры решения подобных задач имено так и сделаны. На третий взгляд – вообще всё замечательно: после компиляции код работает, документы выгружает. Ура.

Хуже на четвёртый взгляд, взгляд тестировщика – не выгружаецца! Целевая папка как бы недоступна… Нда… Модуль резервного копирования в ту же папку спокойно свои файлы сохраняет… При помощи отладчика можно наблюдать, как конструктор

 new DirectoryInfo(path)
без выбрасывания каких-либо исключений возвращает непустой объект (что и ожидается), у которого свойство Exists == false. Сюрприз, фокус-покус.

Фокус разоблачается разглядыванием в Рефлекторе или IL-шпионе (ILSpy) кода классов из пространства Microsoft.SharePoint.Administration.Backup. Там методы System.IO используются примерно так:

using (SecurityContext.RevertToSelf())
{
info = new DirectoryInfo(dir);
}

Класс Microsoft.SharePoint.Utilities.SecurityContext почему-то “внутренний”, использовать как обычно его не получится, но для Reflection преград же нет… Дразнюсь

Technorati Tags: , ,

1 комментарий:

DkmS комментирует...

Включил в Студии проверку кода - про код этого класса вывалилось больше 40 предупреждений - про неправильное освобождение ресурсов, про хилую безопасность и даже про неправильно названные переменные.
Мда... Они там у себя не включают проверку, что ли?