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