如何参考外部模块的功能



我想为自己的游戏创建一个简单的游戏引擎,我想让它支持脚本系统。

我将使自己的脚本语言被编译到C#代码,并作为DLL模块构建,并由主应用程序加载。但是,这里有几个问题。

  1. 如何在运行时链接编译的DLL?

    i可以将模块链接到"参考"中。但是我不知道如何通过编程运行时链接DLL。

  2. 如何使加载模块引用主应用程序的功能或变量等...

    加载的模块(编译脚本)必须为其目的调用Main Application的成员(嗯,我不知道它是正确的表达...)。

如何解决这些问题?我希望这个问题将通过纯C#(或.NET框架)解决,而不是外部库。

谢谢!

您的问题比与代码相关的更架构。

首先,编写一个转介器(将一种语言转换为另一种语言的代码)是一项艰巨的任务。不过,即时编译C#很容易。您可以使用罗斯林。请查看本文以获取令人敬畏的教程:http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-into-memory-and-code-memory-and-executing-it-in-with-roslyn。

接下来是另一个问题。一旦获得了DLL,就需要将其加载到主应用程序中。这也非常容易。只需使用Assembly.Load(...)方法即可。以下是一个示例:https://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110).aspx,但是一旦将DLL加载到AppDomain,您就需要知道卸载它。如果您不使用任何技巧,则将您的DLL加载到应用程序的主应用程序中。然后,当您更改DLL中的代码时,您将无法摆脱它。唯一的方法是关闭并重新启动应用程序。否则,您需要将DLL加载到单独的AppDomain中。

现在,如何参考应用程序功能。为此,您需要创建一个interface。代码您的应用程序在一个符合接口的类中功能,然后将此类的实例传递到您加载的其他类中,并通过动态加载的DLL进行实例。

正如我所描述的那样,加载dll不会做任何有用的。您需要从DLL创建类实例。为此,您可以使用Activator.CreateInstance(...)。作为您即将创建的类的参数,将传递一个类似于您创建的界面的类实例。作为您的参考,此软件开发模式称为"策略"。

如何在运行时链接编译的DLL?

i可以将模块链接到"参考"中。但是我没有 知道如何通过编程运行时链接DLL。

您应该使用反射来动态加载指定文件夹的DLL(作为插件)。示例可以在这里和这里找到。

如何使加载模块引用主要应用程序的功能,或 变量等...

加载的模块(编译脚本)必须调用Main Application的 成员(好吧,我不知道它是否正确...) 这是目的。

您应该根据框架的接口进行编码。而且您不要求插件调用您的框架,而是您的框架应致电。

最新更新