Environment.CurrentDirectory - это простая оболочка для функций winapi GetCurrentDirectory и SetCurrentDirectory . Действительно, попытка установить каталог требует разрешений UnmanagedCode. Всякий раз, когда какая-либо функция не позволяет вашему сайту работать с частичным доверием, вы вправе опасаться зависимости от нее. :)
Из документации SetCurrentDirectory
:
Изменяет текущий каталог для текущего процесса .
Лучшее объяснение, которое я могу найти, касающееся взаимосвязи между процессом w3wp.exe
и сайтом ASP.NET: этот ответ . Любая другая страница на вашем сайте может потенциально изменить текущий рабочий каталог вашей страницы. Любые страницы на любом другом сайте в том же пуле приложений могут потенциально изменить текущий рабочий каталог вашей страницы. Эти внешние изменения в текущем рабочем каталоге могут произойти в любое время во время выполнения вашей страницы. С другой стороны, страница на сайте в другом пуле приложений не изменит текущий рабочий каталог вашей страницы. Причина, по которой я говорю «возможно», заключается в том, что это становится еще сложнее, если вы рассматриваете сценарии веб-сада, где может быть несколько процессов для одного сайта ASP.NET.
Теперь учтите, что SetCurrentDirectory
не является потокобезопасным:
Многопоточные приложения и общие
код библиотеки не должен использовать
Функция SetCurrentDirectory и
следует избегать использования относительного пути
имена. Текущее состояние каталога
написанный SetCurrentDirectory
функция хранится как глобальная
переменная в каждом процессе, поэтому
многопоточные приложения не могут
надежно использовать это значение без
возможно повреждение данных от других
темы, которые также могут читать или
установка этого значения. Это ограничение
также относится к
GetCurrentDirectory и
Функции GetFullPathName.
исключение, когда приложение
гарантированно работает в
один поток, например, разбор
имена файлов из командной строки
строка аргумента в основном потоке
до создания каких-либо дополнительных
потоки. Использование относительных имен путей в
многопоточные приложения или общие
код библиотеки может привести к непредсказуемости
результаты и не поддерживается.
Скорее всего, вы не хотите зависеть от текущего рабочего каталога . Сказав это, учитывая, насколько глупо полагаться на текущий рабочий каталог, вы можете быть достаточно уверены, что никакой другой код не будет касаться его. :) Быстрый просмотр Reflector показывает, что никакой код .NET Framework не меняет его. Хотя некоторые функции это проверяют, так что следите за ними. Если вы контролируете среду развертывания, вы можете убедиться, что ваш сайт работает в собственном пуле приложений. При правильной технике синхронизации вы сможете безопасно обновить текущий рабочий каталог. Я бы не стал считать это чем-то другим, кроме взлома.