.net 在';沙箱环境';
在这里,用户将动态选择dll,应用程序将执行该dll中的一些方法。(如果您遵循第一个链接,您将看到我正在使用.Net Framework开发一种游戏应用程序) 例如,当战斗开始时,执行dll中的.net 在';沙箱环境';,.net,assemblies,sandbox,.net,Assemblies,Sandbox,在这里,用户将动态选择dll,应用程序将执行该dll中的一些方法。(如果您遵循第一个链接,您将看到我正在使用.Net Framework开发一种游戏应用程序) 例如,当战斗开始时,执行dll中的run方法 由于将执行run方法中指定的任何内容,因此必须应用相当多的安全约束 例如,如果编写dll的用户,而不是只使用界面中适用的方法(机器人用来行走和开火的方法等),调用将检索文件甚至可能从硬盘中删除文件的方法…当另一个用户将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();
}
for(int i=0;i
您希望做的基本上是在单独的应用程序域中运行程序集。查看MSDN上的这一页,了解一个良好的起点。实际上,这是一个非常东方的做法:
通常情况下,你可能只是和
AppDomain newDomain = AppDomain.CreateDomain(name);
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name));
但有一点很有趣,AppDomain.Load方法将程序集加载到新的应用程序域以及当前域
一个更优雅的解决方案是在3.5中使用System.AddIn命名空间
然后,您可以使用类似AddinSecurityLevel的
//Activate the selected AddInToken in a new
//application domain with the Internet trust level.
Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);
//以新的方式激活选定的AddInToken
//具有Internet信任级别的应用程序域。
Calculator CalcAddIn=已选择的Token.Activate(AddInSecurityLevel.Internet);
有关详细信息,请参阅