在“沙箱环境”中从.Net应用程序加载程序集

时间:2009-02-04 04:31:34

标签: .net assemblies sandbox

我是currently developing an application,用户将动态选择dll,应用程序将执行该dll中的一些方法。 (如果您按照第一个链接,您将看到我正在使用.Net Framework 开发一种Robocode游戏应用程序。)

例如,当战斗开始时,将执行dll中的run方法。

由于将执行run方法中指定的任何内容,因此必须应用相当多的安全约束。

例如,如果编程dll的用户,而不是仅使用适用于接口的方法(机器人用于行走和触发的方法等等),则调用将检索文件的方法,甚至可能从硬盘中删除文件......当另一个用户将该dll加载到他的计算机中时,这些方法将在他的电脑上调用,他的文件将被这个恶意代码修改。

因此,我需要以某种方式使这个应用程序从某种沙盒环境运行,这样无论调用什么方法,它都不会影响打开dll的计算机的硬盘。

关于如何开始这样做的任何想法?

以下是我如何加载这些dll并调用其方法的示例:

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

2 个答案:

答案 0 :(得分:7)

通常情况下,你可能只是和

一起生活
AppDomain newDomain = AppDomain.CreateDomain(name);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name));

但有一点很有意思的是,AppDomain.Load方法会将程序集加载到新的应用程序域以及当前域。

更优雅的解决方案是在3.5中使用System.AddIn命名空间。 - 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

答案 1 :(得分:2)

您要做的是基本上在单独的应用程序域中运行程序集。在MSDN上查看此页面是一个很好的起点。这实际上非常东方:

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