3

在我的游戏(也是用 C# 编写的)中,我想包含某种自定义支持。速度是一个很大的问题,因为我计划将游戏的主要部分卸载到脚本中。因此,我选择使用 C# 编写游戏内事件和内容的脚本。用户还应该能够使用 C# 为游戏编写脚本和插件。(我知道 C# 不是脚本语言。)

我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能。用户还可以提供代码作为源代码(在这种情况下游戏将编译它)。 在某些情况下,编译的用户“脚本”可以/也可以传输给其他玩家。例如,用户可以在家中或其他任何地方构建脚本陷阱。

以下是我的问题:

  1. 安全

    如何确保提供的代码被迫只调用提供的 API(类)的东西?为了防止脚本作弊,恶意活动......

    有没有办法在某种 VM 或低信任环境中运行已编译的代码?

  2. 速度

    这种方法是否足够快?(每隔一帧或每隔一帧调用多达 100 个自定义程序集的函数)。对此有什么建议吗?

    也许可以通过将所有用户内容编译成一个大程序集或其他什么来获得速度优势?

  3. 尺寸

    我怎样才能使编译后的代码变小(除了压缩它)?因为玩家可能需要下载数十个脚本......

    有没有办法去除不是绝对​​必要的东西?像调试信息或类名之类的......

运行时编译对我来说相当新(这就是我在这里问的原因)。因此,指出一些主要的初学者错误和/或安全问题会很好。

编辑:

只是为了澄清:用户插件/脚本或任何你想调用的东西都是一个类(也是用 C# 编写的),它必须实现特定的功能,如“GetAddonInfo”、“Init”、“Update”......就像一个从我的抽象“插件”类派生的普通 C# 类。

4

2 回答 2

5

你想看看这个旧 Microsoft 示例项目的返工

http://terrarium2.codeplex.com/

它基本上可以完成您想要的一切。

将代码编译成 DLL 并在环境中运行

检查允许的 API 调用。

等等

版本 2 被重新编写以利用 Web 服务和许多其他功能。从您的问题来看,您可能对 Terrarium 1 更感兴趣。但是,我似乎无法追踪到它,因此您可能不得不“解决”更复杂的 2.0 版本。

于 2011-08-22T02:13:54.007 回答
3

查看 MEF 和 MAF——它们都是旨在将 C# 和 VB 脚本添加到现有应用程序的框架。您可以为您的脚本创建一个 appdomain,然后使用代码访问安全性来严格限制这些脚本可以执行的操作。

这个问题可能会有所帮助。

在 MEF 和 MAF 之间进行选择(System.AddIn)

于 2011-08-22T02:57:20.823 回答