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

And*_*ech 2 .net assemblies sandbox

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

例如,当战斗开始时,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();
}
Run Code Online (Sandbox Code Playgroud)

ama*_*int 7

通常,你可能只是和你一起生活

AppDomain newDomain = AppDomain.CreateDomain(name);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name));
Run Code Online (Sandbox Code Playgroud)

但有一点有趣的是,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);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb355219.aspx.