1

以前我的 WPF 应用程序大小为 4096KB,作为单个 .exe 文件。

现在我已经像这样将应用程序拆分为多个

JIMS.exe           Main Application-->103KB
JIMSDAL.dll        Data Access Layer-->43KB
JIMS.Core.dll      Core classes for MVVM-->110KB
JIMS.Commands.dll  MVVM Commands-->11KB
JIMS.Controls.dll  WPF UserControls-->25KB
JIMS.Resources.dll Fonts,icons and xaml resources.-->44KB
UtilityClasses.dll Other classes like Helper classes-->10KB

我进一步考虑通过将视图模型从 JIMS.exe 删除到 JIMS.ViewModel.dll 来添加另外两个 dll。

现在我的问题是,这是将单个 EXE 吐入多个 dll 的好方法吗?

请让我知道这样做的优点和缺点是什么。

我有一些意见,如果有更多的 dll,JIMS.exe 将难以使用该应用程序联系许多 dll。由于每次调用都必须读取相应的 dll。

提前致谢。

4

6 回答 6

4

我没看到有人提到,所以我会插话。

根据我的经验,在 C# 中使用这种方法的主要原因是exchangeability- 能够轻松替换系统的某些部分。

举个例子,我们在我当前的项目中使用这种方法。每个 GUI 组件(或UserControl)都是它自己的 dll,并在启动时动态导入。这使我们能够为我们的 GUI 实现插件架构,并允许我们的 GUI 开发人员在单独的项目中工作,而不必加载所有逻辑/等。

我不能告诉你它是“好”还是“坏”——这是你为特定目的所需要的。我可以告诉你的是,这不是“错误的”

于 2012-05-11T08:45:35.890 回答
0

如果您打算在其他项目中独立使用这些 dll,那么请确保您可以拆分它们,否则有什么好处?我不确定您的应用程序,但如果您正在编写一个控件,供其他开发人员使用或将应用程序集成到其他应用程序中,那么单独管理 dll 可能会成为一项艰巨的任务。我不太确定你的最后意见。我希望看到社区对此的投入

于 2012-05-11T05:56:12.133 回答
0

它有很多好处:

-如果您正在做一个小更新,您的用户不必下载完整的 exe,他们只需要下载一些更小的 dll -如果您正在编写另一个使用 dll 的程序,您的用户可以保存内存 - 如果你的程序变得巨大并且你有几分钟的构建时间,你不必重建所有,如果你正在做更改,你可以再次构建更改后的 dll

但它有一些负面的观点: -您的用户可能会删除 dll(如果他们真的很愚蠢),然后想知道为什么程序不再工作 -没有 dll,您的用户可以快速构建可移植版本

如果您的项目很大(听起来像,因为 4MB exe),我会拆分程序,但如果它是一个小程序,我不会拆分程序。

于 2012-05-11T06:03:18.923 回答
0

我在我正在开发的应用程序中采用了类似的方法,但对我来说,主要原因是启用应用程序的控制台版本的开发。这样我就可以使用 XAML GUI 在应用程序中提供简单的一次性操作,然后使用控制台版本安排更长时间的运行/维护操作。它们都使用相同的模型和视图模型层,但显然是不同的“视图”。

对我来说,这感觉像是 MVVM 的一大好处,尤其是当您将组件分解为单独的项目/库时。

于 2012-05-11T12:34:15.243 回答
0

我们目前正在开发针对特定利基市场的大规模应用程序,但我们的许多客户需要小型定制应用程序,这些应用程序虽然根据他们的需求量身定制,但他们经常使用使用单个数据库的产品的许多不同功能。因此,我们将 Wpf 应用程序拆分为许多不同的程序集,这是能够做到这一点的唯一真正方法。在许多方面,它几乎使这些附加工具成为我们创建部分新开发和部分集成现有开发的一部分,这使得这些新应用程序可以非常快速地与大多数经过测试的代码组合在一起。

于 2014-08-25T17:59:12.497 回答
-1

最好将应用程序拆分为多个 dll。这使得项目更易于管理,更容易添加/删除功能,更容易使用现有的 dll 编写全新的应用程序。我认为动态链接更适合应用程序.....

动态调用的好处

  1. 如果您更改子程序中的某些内容,则无需重新链接您的应用程序;只有子例程 DLL 需要重新链接。
  2. 所有调用此子例程的可执行文件将共享同一个 DLL;代码和数据。由于您的应用程序只加载一个动态调用的子例程的副本,因此它使用的内存更少。
  3. 动态调用的子例程中包含的值的更改对所有使用它的 DLL 都是可用的,因为它们都共享子例程的相同副本。
  4. 您可以通过取消子例程来释放动态调用的子例程正在使用的内存。然而,这在 32 位 Windows 虚拟内存环境中通常没有多大用处,因为无论如何 Windows 都会从计算机的实际内存池中“分页”非活动数据。
  5. 项目清单

动态调用的坏处

  1. 每个动态调用的子例程都必须作为 DLL 链接(除非您使用导入库来公开 DLL 中的其他入口点)。因此,如果您的应用程序包含数百个子例程并且它们都是动态调用的,那么您将需要分发数百个 DLL。
  2. 可以混合您的 DLL 的版本。这对于分发您的应用程序和最终用户不正确地安装更新都可能是一个问题。
  3. 如果您的某个 DLL 丢失,您可能不知道它,直到用户使用一些尝试调用该 DLL 的工具。届时,除非您处理这种情况,否则您的应用程序将异常终止。
  4. 如果你调用一个 DLL,取消它,然后再次调用它,你会产生更多的 I/O,因为如果你取消它,则需要重新加载例程。这会降低应用程序的速度,因为它需要更多的磁盘活动。同样,在 Windows 环境中,这通常是不必要的,因为 Windows 在管理内存方面做得很好。
  5. 如果您混合和匹配对同一子例程的静态和动态调用,您的软件可能会同时在内存中拥有多个不同的版本。猜猜尝试调试这个烂摊子会有多有趣?

有关更多信息,请参见此处

于 2012-05-11T05:56:36.800 回答