以下是问题的原因:www.devplusplus.com/Tests/CSharp/Hello_World.
虽然之前提出了类似的问题,但网上的许多答案都有几个问题:
像这样的东西:
var evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
var permissionSet = SecurityManager.GetStandardSandbox(evidence);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找不到创建AppDomain并加载程序集的方法,该程序集不在文件系统中,而是在RAM中.
同样,上面列出了其他解决方案不起作用的原因:1.许多是4.0之前的版本,而且2.许多人依赖指向文件系统的".Load"方法.
答案2:我有一个汇编引用,因为它是由CSharpCodeProvider类生成的,所以如果你知道一种方法将它转换为字节数组,那将是完美的!
var provider = new CSharpCodeProvider(new Dictionary<String, String>
{ { "CompilerVersion", "v4.0" } });
var compilerparams = new CompilerParameters
{ GenerateExecutable = false, GenerateInMemory = true, };
var compilerResults = provider.CompileAssemblyFromSource(compilerparams,
string_Of_Code_From_A_User);
var instanceOfSomeClass = compilerResults.CompiledAssembly
.CreateInstance(className);
// The 'DoSomething' method can write to the file system and I …Run Code Online (Sandbox Code Playgroud) 我正在使用本指南在我的程序中创建脚本平台.
我想沙箱他们被允许做什么和不做什么.
我有一些名称空间,我只想让代码使用它,而且几乎不允许其他所有内容.
在运行时从自定义代码编译的程序集通过我找到的代码链接到主程序:
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
try
{
string location = assembly.Location;
if (!String.IsNullOrEmpty(location))
{
parameters.ReferencedAssemblies.Add(location);
}
}
catch (NotSupportedException)
{
// this happens for dynamic assemblies, so just ignore it.
}
}
Run Code Online (Sandbox Code Playgroud)
因此mods(运行时动态生成的代码)可以与主程序通信.
由于我的知识和研究有限,我似乎需要创建自定义AppDomain并使用PermissionSet,但我不确定如何实现这一点.
我目前正在开发一个应用程序,用户将动态选择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)