【问题标题】:Loading Assemblies from a .Net Application in a 'Sandbox Environment'在“沙盒环境”中从 .Net 应用程序加载程序集
【发布时间】:2009-02-04 04:31:33
【问题描述】:

我是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();
}

【问题讨论】:

    标签: .net assemblies sandbox


    【解决方案1】:

    通常情况下,你可能只是忍受

    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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        相关资源
        最近更新 更多