Загрузка сборок из приложения .Net в «среде песочницы» - PullRequest
2 голосов
/ 04 февраля 2009

Я в настоящее время разрабатываю приложение , в котором пользователь будет динамически выбирать библиотеки DLL, а приложение будет выполнять некоторые методы этой библиотеки DLL. ( если вы перейдете по первой ссылке, вы увидите, что я разрабатываю своего рода игровое приложение Robocode с использованием .Net Framework ).

Например, когда начинается битва, выполняется метод run из dll.

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

Как, например, если пользователь, который запрограммировал dll, вместо использования только методов, которые применимы из интерфейса (методы, которые робот использует для ходьбы и стрельбы и т. Д.), Вызывает методы, которые будут извлекать файлы и может быть, даже удалить файлы с жесткого диска ... и когда другой пользователь загружает dll в свой компьютер, эти методы будут вызываться на его компьютере, и его файлы будут изменены с помощью этого вредоносного кода.

Таким образом, мне нужно каким-то образом заставить это приложение запускаться из своего рода изолированной среды , чтобы любые вызываемые методы не влияли на жесткий диск компьютера, на котором открыта dll.

Любые идеи о том, как я должен начать делать это?

Вот пример того, как я загружаю эти dll и вызываю их методы:

for (int i = 0; i < robotList.Count; i++)
{
    IRunnable o = robotList[i];
    new Thread(delegate()
    {
        o.run();    
    }).Start();
}

Ответы [ 2 ]

7 голосов
/ 04 февраля 2009

Обычно вы можете просто жить с

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.

2 голосов
/ 04 февраля 2009

Что вы хотите сделать, так это запускать сборки в отдельном домене приложений. Проверьте эту страницу на MSDN для хорошей отправной точки. Это на самом деле довольно восточно:

http://msdn.microsoft.com/en-us/library/ms173139(VS.80).aspx

...