![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
kolaspirit |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Добрый вечер. Постараюсь подробно описать проблему.
Необходимо было реализовать "песочницу" (Sandbox) для автоматической проверки олимпиадных решений по программированию через домены приложений (AppDomain). То есть участник соревнования присылает исходник с решением задачи, моя программа компилирует его и запускает exe-файл с помощью AppDomain.ExecuteAssembly(<имя_сборки>) в мною созданном AppDomain, в котором уже выставлены разрешения (Permissions), ограничивающие сборку в правах. Например, чтобы нельзя было работать с реестром, файловой системой, создавать новые процессы, новые домены приложений и т.д. Но я не смог найти ни на форумах, ни в MSDN информацию о том, как ограничить по времени выполнения и по выделению оперативной памяти запускаемую в домене сборку. Сейчас использую связку: AppDomain с его Permissions и Process с возможностью ограничивать время выполнения. Но этот вариант не подходит, так как последовательно сначала сборка исполняется в AppDomain без учета времени и памяти (в этот момент может произойти переполнение или же программа может "вечно" работать), а потом уже, по завершении, запускается в Process. Нужно чтобы все ограничения были в рамках AppDomain. Ниже приведен код. Подскажите, пожалуйста, как решить этот вопрос? Или же подскажите другие варианты, сочетающиеся с AppDomain (от доменов приложений отказываться не вижу смысла, ибо в них есть большая часть необходимых мне ограничений). Не исключаю, что решение может быть простым. Заранее прошу прощения, если его не разглядел. Сам класс "песочницы" (убраны не относящиеся к теме методы и свойства):
Вызов ExecuteAssembly из кода:
Это сообщение отредактировал(а) kolaspirit - 16.4.2014, 04:02 |
||||
|
|||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
http://www.c-sharpcorner.com/UploadFile/ha...-in-dotnet-4-0/
а сам "чужой" код вы можете запускать в потоке, который по таймауту убивать... но по-мне так проще делать суррогатный процесс, имхо так проще чистить ресурсы.. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kolaspirit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Спасибо. Проблема решена.
Это сообщение отредактировал(а) kolaspirit - 15.5.2014, 19:20 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
и как решили? -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kolaspirit |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Следующим образом:
При этом в класс Sandbox был добавлен один метод:
Остается только один вопрос: как мониторить кол-во выделяемой сборкой памяти, пока эта сборка исполняется? Сейчас "проверка на память" происходит после завершения работы потока, что не есть хорошо. Это сообщение отредактировал(а) kolaspirit - 15.5.2014, 21:16 |
||||
|
|||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
поток завести (например в новом домене) и while(true) { смотреть на память } ?) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kolaspirit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Благодарю, уже думал об этом) Но это даже не проблема, решается парой строчек кода. Сейчас думаю над тем, как организовать очередь на проверку решений. Дело в том, что каждый участник, присылая решение на проверку, вызывает свой экземпляр dll-библиотеки, в которой содержатся все эти классы (для проверки). Мне необходимо сделать общую для всех очередь, например, чтобы одновременно могло проверяться не более 5 присланных решений, остальные должны дожидаться, находясь в этой очереди. Пока не копал глубоко, скорей всего решение в скором времени найдется. Однако, если есть здравые соображения по этому поводу, буду весьма признателен. Если в скором времени решение не найду, скорей всего, вынесу в отдельную тему. Вопрос сам по себе интересный. Это сообщение отредактировал(а) kolaspirit - 15.5.2014, 21:57 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
ну заведите очередь "задач на проверку" синхронизированную семафором -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kolaspirit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.12.2011 Репутация: нет Всего: нет |
Спасибо за совет, буду разбираться. До этого с семафорами только вскользь был знаком) Это сообщение отредактировал(а) kolaspirit - 16.5.2014, 10:27 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |