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

C# 限制对运行时编译脚本的命名空间访问,c#,.net,mono,unity3d,assemblies,C#,.net,Mono,Unity3d,Assemblies,我正在为我的Unity游戏的某个方面构建一种修改系统。它基本上允许普通用户编写一些C#代码,用于在特定时间访问游戏的某些元素,比如让多人游戏服务器的主机能够决定使用什么参数加载什么地图等 对于那些不知道的人来说,Unity使用Mono的.NET2.0等价物,所以这个问题对Unity不太具体,而更倾向于C#和.NET 我已经可以加载程序集了,但是现在我已经到了一个非常好的地步,如果我可以给“用户”一些访问程序集的权限,比如System和UnityEngine。当然,我可以在编译器参数的Refere

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

对于那些不知道的人来说,Unity使用Mono的.NET2.0等价物,所以这个问题对Unity不太具体,而更倾向于C#和.NET

我已经可以加载程序集了,但是现在我已经到了一个非常好的地步,如果我可以给“用户”一些访问程序集的权限,比如
System
UnityEngine
。当然,我可以在
编译器参数
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);
我已经知道了解决方法,例如创建包装程序集并只提供包装程序集,但是如果我能够以更直接的方式这样做,将节省大量时间。

EDIT

有一个库(实际上是一组库)称为NRefactory。深入了解一下它的特点

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

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

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

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

原创

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

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

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

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


也许你不应该以这样一种“严格”的方式限制你的修改者。

一般的问题是,这是一个多人游戏,所以除非我限制修改,否则人们制作包含黑客和欺骗的修改器会很容易。我明白了。那样的话,你可以欺骗自己。看我的编辑。我希望我能给你一秒+1!我一定会看一看NREFORMATION并尝试一下,再次感谢你相信我,当我说会有分娩疼痛时。大的也是大的。但是,一旦你掌握了基本知识,并且你的小应用程序能够在无人值守的情况下处理这些库,你就是黄金。图书馆变了?没问题,只要重新运行应用程序,然后砰的一声。顺便说一句,像这样的插件在资产存储中可以获得合理的价格:)