2

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

对于那些不知道的人,Unity 使用 Mono 的 .NET 2.0 等价物,所以这个问题不是针对 Unity,而是更多地针对 C# 和 .NET。

我已经可以加载程序集了,但是现在我已经到了这样的地步,如果我可以给“用户”一些对程序集的访问权限,例如SystemUnityEngine. 我当然可以将dll包含在 的ReferenceAssemblies属性中CompilerParameters,但这将使他们能够访问可能有害的功能,例如反射实例化销毁以及许多其他功能。

我如何将程序集引用限制为仅某些名称空间,例如System.IOand 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);

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

4

1 回答 1

1

编辑

有一个名为 NRefactory 的库(实际上是一组库)。在这里查看以深入了解其功能。

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

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

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

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

原来的

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

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

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

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

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

于 2014-01-23T11:12:30.810 回答