限制对运行时编译的脚本的命名空间访问
本文关键字:脚本 访问 命名空间 编译 运行时 | 更新日期: 2023-09-27 18:28:55
我正在为Unity游戏的某个方面构建一个类型的修改系统。它基本上允许普通用户编写一些C#
代码,这些代码将用于在特定时间访问游戏的某些元素,比如让多人游戏服务器的主机能够决定用什么参数加载什么地图等。
对于那些不知道的人来说,Unity使用了Mono的.NET 2.0版本,所以这个问题对Unity来说不那么具体,而更倾向于C#和.NET.
我已经可以加载程序集了,但现在我已经到了这样一个地步,如果我能给"用户"一些访问程序集(如System
和UnityEngine
)的权限,那就太好了。当然,我可以在CompilerParameters
的ReferenceAssemblies
属性中包含dll,但这将使他们能够访问可能有害的功能,如反射、实例化和销毁以及许多其他功能。
如何将程序集引用仅限于某些命名空间,如System.IO
和System.Collections
,而不允许访问System.Reflection
?
现在发布一些可能相关的代码:
//Excuse the UnityScript... I find it quicker to do things in
//It's basically C# with Javascript syntax ;)
//Create compiler parameters
var params:CompilerParameters = new CompilerParameters();
params.GenerateExecutable = false;
params.GenerateInMemory = false;
//Add assembly reference
params.ReferencedAssemblies.Add("System.dll");
//I wish I could put System.IO in here instead of System.dll
//Create provider and load/compile assembly
var provider:CodeDomProvider = new CodeDomProvider.CreateProvider("CSharp");
var results:CompilerResults = provider.CompileAssemblyFromFile(params, path);
我已经知道了一些变通方法,比如创建一个包装程序集并只给它们,但是如果我能够以更直接的方式做到这一点,就会节省很多时间。
编辑
有一个库(实际上是一组库)叫做NRefactory。请看这里,深入了解它的功能。
基本上,您可以使用NRefactory分析运行时加载的所有DLL,并使用您自己编写的简单C#程序创建包装器。
其想法是创建一些样板调用包装器,这些包装器将成为网关类的一部分,然后处理所有感兴趣的库并填充网关类。
现在您有了一个网关,可以调用所有有问题的方法。然后,您只需剪切不需要的invoke包装器。
这听起来很复杂,但事实并非如此。我用这种方法在另一个项目中产生了类似的东西。NRefactory是一个非常强大的工具,在分析和发布C#代码时,它为您提供了惊人的可能性。
原件
据我所知(不多:)你不能这样做。简单的原因是你的域将获得dll及其所有可公开访问的成员。
如果没有某种网关,阻止对这些成员的调用是不可能的。
实现这样一个网关完全是另一回事。但正如你所说,要做到这一点需要时间和精力。
我不认为限制使用UnityEngine是个好主意。您基本上正在切割所有相关的Unity功能。
也许你不应该以如此"严格"的方式限制你的插件。