在我的游戏(也是用 C# 编写的)中,我想包含某种自定义支持。 速度是一个很大的问题,因为我计划将游戏玩法的主要部分卸载到脚本中。 因此,我选择使用 C# 来编写游戏内事件和其他内容的脚本。 用户还应该能够使用 C# 为游戏编写脚本和插件。 (顺便说一句,我知道 C# 不是脚本语言。)
我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能。 用户还可以提供代码作为源代码(游戏会在这种情况下对其进行编译)。 Compiled 在某些情况下,用户“脚本”可以/也将传输给其他玩家。 例如,用户可以在他的家中或其他地方构建脚本陷阱。
这是我的问题:
安全
如何确保所提供的代码被强制只调用所提供的 API(类)的内容?防止脚本作弊,恶意事件...
有没有办法在某种 VM 或低信任环境中运行编译后的代码??
速度
这种方法是否足够快? (每一帧或每一帧从多达 100 个自定义程序集调用函数)。 对此有什么建议吗?
也许可以通过将所有用户内容编译成一个大程序集或其他任何方式来获得速度优势??
大小
我怎样才能使编译后的代码变小(除了压缩它)? 因为玩家可能需要下载几十个脚本...
有没有办法去除不是绝对必要的东西?比如调试信息或者类名之类的...
运行时编译对我来说相当陌生(这就是我在这里问的原因)。因此,如果能指出一些主要的初学者错误和/或安全问题,那就太好了。
编辑:
澄清一下: 用户插件/脚本或任何您想调用的东西将是一个类(也是用 C# 编写的),必须实现特定功能,如“GetAddonInfo”、“Init”、“Update”... 就像派生 self 的抽象“插件”类的普通 C# 类一样。
最佳答案
您想看一看这个旧的 Microsoft 示例项目的返工
http://terrarium2.codeplex.com/
它基本上可以满足您的所有需求。
将代码编译成DLL并在环境中运行
检查允许的 API 调用。
等等
第 2 版被重新编写以利用网络服务和许多其他功能。从您的问题看来,您可能对 Terrarium 1 更感兴趣。但是,我似乎无法追踪到它,因此您可能不得不“接受”更复杂的 2.0 版本。
关于C# 脚本和安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142487/