Загрузка сборок из приложения.Net в "среде песочницы"
В настоящее время я разрабатываю приложение, в котором пользователь будет динамически выбирать библиотеки DLL, а приложение будет выполнять некоторые методы этой библиотеки DLL. (если вы перейдете по первой ссылке, вы увидите, что я занимаюсь разработкой своего рода игрового приложения Robocode с использованием.Net Framework).
Например, когда начинается битва, run
метод из dll выполняется.
Поскольку все, что было указано в методе run, будет выполнено, существует немало ограничений безопасности, которые необходимо применить.
Как, например, если пользователь, который запрограммировал dll, вместо использования только методов, которые применимы из интерфейса (методы, которые робот использует для ходьбы и стрельбы и т. Д.), Вызывает методы, которые будут извлекать файлы и, возможно, даже удалять файлы с жесткого диска... и когда другой пользователь загружает эту dll в свой компьютер, эти методы будут вызываться на его компьютере, и его файлы будут модифицированы этим вредоносным кодом.
Таким образом, мне нужно как-то заставить это приложение работать из своего рода изолированной среды, чтобы любые вызываемые методы не влияли на жесткий диск компьютера, на котором была открыта dll.
Любые идеи о том, как я должен начать делать это?
Вот пример того, как я загружаю эти библиотеки и вызываю их методы:
for (int i = 0; i < robotList.Count; i++)
{
IRunnable o = robotList[i];
new Thread(delegate()
{
o.run();
}).Start();
}
2 ответа
Обычно вы можете просто жить с
AppDomain newDomain = AppDomain.CreateDomain(name);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name));
Но один интересный момент заключается в том, что метод AppDomain.Load загрузит сборку в новый домен приложения, а также в текущий домен.
Более элегантным решением является использование пространства имен System.AddIn в 3.5. - http://msdn.microsoft.com/en-us/magazine/cc163476.aspx
Затем вы можете указать уровень доверия для своего надстройки, используя AddinSecurityLevel, например
//Activate the selected AddInToken in a new
//application domain with the Internet trust level.
Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);
См. http://msdn.microsoft.com/en-us/library/bb355219.aspx для получения подробной информации.
То, что вы хотите сделать, это в основном запуск сборок в отдельном домене приложений. Проверьте эту страницу на MSDN для хорошей отправной точки. Это на самом деле довольно восточно:
http://msdn.microsoft.com/en-us/library/ms173139(VS.80).aspx