限制运行时编译脚本的命名空间访问

时间:2013-08-24 04:29:31

标签: c# .net mono unity3d assemblies

我正在Unity中为游戏的某个方面构建一个类型的修改系统。它基本上允许普通用户编写一些C#代码,这些代码将用于在特定时间访问游戏的某些元素,例如让多人游戏服务器的主机能够决定要加载什么地图。参数等。

对于那些不了解的人,Unity使用Mono相当于.NET 2.0,所以这个问题不是特定于Unity,而是更多地针对C#和.NET。

我已经有了程序集加载工作,但现在我已经到了能够让“用户”对{{1 }和System。我当然可以在UnityEngine的{​​{1}}属性中包含 dll ,但这会让他们访问可能有害的功能,例如 reflection < / em>,实例化销毁以及许多其他人。

如何在不授予ReferenceAssemblies访问权限的情况下,仅将程序集引用限制为某些名称空间,例如CompilerParametersSystem.IO

现在发布一些可能相关的代码:

System.Collections

我已经知道了解决方法,例如创建一个包装器程序集并且只给它们,但是如果我能够以更直接的方式执行此操作,它将节省大量时间。

1 个答案:

答案 0 :(得分:1)

修改

有一个名为NRefactory的库(实际上是一组库)。看看here,深入了解其功能。

基本上你可以做的是分析你在运行时使用NRefactory加载的所有DLL,并使用你自己编写的简单C#程序创建包装器。

我们的想法是创建一些样板调用包装器,这些包装器将成为您的网关类的一部分,然后处理您感兴趣的所有库并填充网关类。

现在您有一个能够调用相关方法的网关。然后你只需剪切你不需要的调用包装器。

听起来很复杂但实际上并非如此。我用这种方法在另一个项目上产生类似的东西。 NRefactory是一个非常强大的工具,在分析和发布C#代码时为您提供了惊人的可能性。

<强> ORIGINAL

据我所知(这不是很多:))你不能这样做。原因很简单,您的域名将获得dll及其所有可公开访问的成员。

如果没有某种网关,就无法阻止对这些成员的调用。

这种网关的实现完全是另一回事。但正如你所说,这需要时间和精力。

我认为限制使用UnityEngine并不是一个好主意。您基本上是在削减所有相关的Unity功能。

也许你不应该以这种“严格”的方式限制你的modders。