将脚本功能添加到.NET应用程序

mid 发布于 2018-02-03 .net 最后更新 2018-02-03 01:04 637 浏览

我有一个用C#编写的小游戏。它使用数据库作为后端。它的 一个trading card game,我想把这个卡的功能作为一个脚本来实现。 我的意思是,我基本上有一个接口ICard,卡类实现(public class Card056 : ICard),其中包含由游戏调用的函数。 现在,为了使事物可维护/可修改,我希望将每张卡片的类作为数据库中的源代码,并在首次使用时进行基本编译。所以,当我不得不添加/更换卡片时,我只需将其添加到数据库中,并告诉我的应用程序刷新,而不需要进行任何程序集部署(特别是因为我们将讨论每张卡片1个程序集,这意味着数百个程序集) 。 那可能吗?从源文件注册一个类,然后实例化它等

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);
这个语言是C#,但是如果可以用任何.NET语言编写脚本,那么额外的奖励也是可以的。
已邀请:

mid

赞同来自:

是的,我考虑过这个问题,但是很快我发现另一个特定领域语言(DSL)会有点太过分了。 从本质上讲,他们需要以不可预知的方式与我的游戏状态进行交互。例如,一张卡片可以有一个规则:“当这张卡片进场时,除敌人被祝福之外,你所有的不死生物都会对飞行的敌人造成+3的攻击。由于交易卡游戏是基于回合的,所以GameState Manager将发起OnStageX事件并让卡以任何方式修改其他卡或GameState。 如果我尝试创建一个DSL,我必须实现一个相当大的功能集,并且可能不断更新它,这将维护工作转移到另一个部分而不实际删除它。 这就是为什么我想留在一个“真正的”.NET语言基本上能够发射事件,让卡片以任何方式(在代码访问安全性的范围内)操纵游戏状态的原因。

taut

赞同来自:

Oleg Shilo's C# Script solution (at The Code Project)真的是在您的应用程序中提供脚本功能的一个很好的介绍。 另一种方法是考虑为脚本专门构建的语言,例如IronRubyIronPythonLua。 IronPython和IronRuby现在都可用。 有关嵌入IronPython的指导阅读 How to embed IronPython script support in your existing app in 10 easy steps。 Lua是游戏中常用的脚本语言。有一个.NET的Lua编译器,可从CodePlex - http://www.codeplex.com/Nua获得 如果您想了解如何在.NET中构建编译器,那么该代码库是一个很好的阅读。 完全不同的角度是尝试PowerShell。有很多将PowerShell嵌入到应用程序中的例子 - 这里是关于这个主题的一个彻底的项目: Powershell Tunnel

ueum

赞同来自:

您可能可以使用IronRuby。 否则,我建议你有一个目录放置预编译程序集。然后你可以在数据库中引用程序集和类,并使用反射在运行时加载正确的程序集。 如果你真的想在运行时编译,你可以使用CodeDOM,那么你可以使用反射来加载动态程序集。 MSDN article which might help

set

赞同来自:

您可以使用任何DLR语言,这提供了一种真正轻松托管自己的脚本平台的方法。但是,您不必为此使用脚本语言。您可以使用C#并使用C#代码提供程序进行编译。只要您将其加载到自己的AppDomain中,就可以将其加载和卸载到您的心中。

yeum

赞同来自:

如果您不想使用DLR,则可以use Boo (which has an interpreter),也可以考虑the Script.NET (S#) project on CodePlex。使用Boo解决方案,您可以选择编译后的脚本或使用解释器,Boo通过其开放的编译器体系结构提供了一种很好的脚本语言,具有灵活的语法和可扩展的语言。尽管Script.NET看起来不错,但是你可以很容易的扩展这个语言,也可以使用一个非常友好的编译器生成器(Irony.net)。

punde

赞同来自:

我司销售的主要应用程序做了非常相似的事情来提供客户定制(这意味着我不能发布任何来源)。我们有一个加载动态VB.NET脚本的C#应用​​程序(尽管可以很容易地支持任何.NET语言 - 因为定制团队来自ASP背景,所以选择VB)。 使用.NET的CodeDom,我们使用VB CodeDomProvider(烦人的是默认为.NET 2)编译数据库中的脚本构造函数)。使用CodeDomProvider.CompileAssemblyFromSource方法编译它(您可以传递设置来强制它在内存中编译。 这会导致内存中有数百个程序集,但是您可以将所有动态类的代码放在一个程序集中,并在发生任何更改时重新编译整个程序集。这样做的好处是您可以在测试时添加一个标记以在PDB磁盘上进行编译,从而允许您通过动态代码进行调试。

fet

赞同来自:

我建议使用LuaInterface,因为它已经完全实现了Lua,看起来Nua并不完整,可能不会实现一些非常有用的功能(协程等)。 如果你想使用一些外部预装的Lua模块,我建议使用1.5.x的版本,而不是建立完全托管代码的2.x系列,而不能公开必要的C API。

equi

赞同来自:

.NET(5.0?)的下一个版本已经有很多关于打开“编译器即服务”的讨论,这将使直接脚本评估成为可能。

nnam

赞同来自:

我正在为NET 1.1应用程序使用LuaInterface1.3 + Lua 5.0。 Boo的问题在于,每当您在运行时解析/编译/评估您的代码时,都会创建一组boo类,这样您将会发生内存泄漏。 另一方面,Lua并没有这样做,所以它非常稳定,并且工作得非常好(我可以将C#中的对象传递给Lua并向后传递)。 到目前为止,我还没有把它放在PROD,但似乎非常有前途。 我在使用LuaInterface + Lua 5.0的PROD中遇到了内存泄漏问题,因此我使用了Lua 5.2,并直接使用DllImport链接到C#中。内存泄漏在LuaInterface库中。 Lua 5.2:从http://luabinaries.sourceforge.nethttp://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download 一旦我这样做了,我所有的内存泄漏都消失了,应用程序非常稳定。