DLL的有效使用

DLL的有效使用,dll,Dll,到目前为止,我只使用DLL作为应用程序中插件的源代码 但是我知道,使用DLL可以让我更新我的程序客户端,这比一直重新下载主EXE要容易得多 问题是,我似乎找不到一种有效的方法在我的应用程序中使用dll,或者以一种会影响程序的方式使用dll,但不强迫我改变整个程序的工作方式 本例中的应用程序是一个XNA游戏 例如,我有三个主要的类,不包括主要的游戏类 单位 球员 网络 我希望单位/玩家在一个DLL中,网络在另一个DLL中,或者至少将网络移动到一个单独的DLL中,但是网络类的工作方式和编码方式要求D

到目前为止,我只使用DLL作为应用程序中插件的源代码

但是我知道,使用DLL可以让我更新我的程序客户端,这比一直重新下载主EXE要容易得多

问题是,我似乎找不到一种有效的方法在我的应用程序中使用dll,或者以一种会影响程序的方式使用dll,但不强迫我改变整个程序的工作方式

本例中的应用程序是一个XNA游戏

例如,我有三个主要的类,不包括主要的游戏类

单位 球员 网络

我希望单位/玩家在一个DLL中,网络在另一个DLL中,或者至少将网络移动到一个单独的DLL中,但是网络类的工作方式和编码方式要求DLL引用游戏,游戏引用DLL,在VisualStudio中防止循环依赖

我的问题是,如何有效地使用DLL来存储我的网络类,我有一些想法,但我不确定其中任何一个是否可行

如果可能的话,我想让整个网络实例从dll运行,根据需要发送、接收和更新游戏数据

但到目前为止,我只能想出一种方法,让接收和发送在Main game.exe中,并将处理函数移动到dll中,即使这样,处理函数也无法与游戏轻松通信

我也想过使用插件系统,但这要求我在网络DLL中使用的所有函数都使用委托,从长远来看,这似乎效率很低

如果主机程序和DLL之间的DLL来回通信不能完成这种事情,那么它们还有什么用呢

当然,我可以使用简单的函数,比如我的颜色类,来解析和返回颜色代码,但是简单的事情不会改变,需要更新


不管怎么说,我总是喜欢漫无目的地谈论那些在大多数情况下都无关紧要的事情,所以感谢您的关注,并感谢您的回复:

好的,那么您有3个相互依赖的类

你能不能改变这种关系,让一个类不再引用另一个类,而是引用一个接口

例如,ClassA有一个使用ClassB-MethodB1的方法 ClassB实现接口IB,所以现在类A有一个对IB的引用

将所有接口放在单独的程序集中。 现在A、B和C彼此没有引用,只引用接口类。
在可执行文件中,使用依赖项注入来连接具体的类实现。

实际上,不使用DLL可以大大简化事情。在这个快速下载的时代,我宁愿通过下载一个可执行文件来更新程序,而不是一堆通常安装在可疑位置的DLL。

通常DLL只是解决方案中有更多项目的产物

所以你要问的问题是:

为什么以及如何在我的解决方案中有更多的项目

它归结为源代码的组织

在OOP中,对象通常可以分组到更小的域中,这些域可以自己描述并作为一个黑盒工作

这些黑盒是DLL

在游戏中,我可以想到几个单独的项目:

基类 博弈逻辑 渲染器 序列化/反序列化存储管理器 音频管理器 代码实用程序。。。 因此,如果您能够以这种方式组织代码,那么就可以使用DLL

如果你不重新组织你所拥有的,你就不能拥有它们


如果应用程序是以一种非常单一的方式编码的,那么在分离代码的逻辑域时可能会遇到麻烦。

因此,可能需要将main exe作为占位符,以启动包含游戏、网络和玩家类的DLL,其中main exe具有每个DLL引用的接口,就像一个结构,这样每个DLL都可以通过exe访问彼此的数据。有趣的是,我可能能够做到这一点,有点混合了我所拥有的和前面提到的插件系统。再说一次,我还不知道依赖注入是什么,所以我想我会查一下:D.谢谢。将代码移动到单独的项目中,并让它们在单独的项目中都很好地工作是很容易的,但当前的问题是,例如,如果我有一个名为IsWalkable的游戏逻辑类,如果玩家可以在某个特定区域行走,我可以很容易地得到返回布尔值,因为我可以调用该函数,我的问题是如何允许该函数访问游戏的其他部分,如地图数据,以便它可以找到玩家是否可以移动到该位置不需要的示例通常是,但是有dll的原因还有很多,上传速度慢通常意味着我希望上传的东西越少越好。