2

目前正在开发一个应用程序,用户将在其中动态选择 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();
}
4

2 回答 2

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

于 2009-02-04T06:21:46.737 回答
2

您要做的基本上是在单独的应用程序域中运行程序集。查看 MSDN 上的此页面以获得良好的起点。这实际上是相当东方的事情:

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

于 2009-02-04T05:11:36.423 回答