Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在将WPF应用程序拆分为多个dll';s是好还是坏?_C#_.net_Wpf_Dll_Exe - Fatal编程技术网

C# 正在将WPF应用程序拆分为多个dll';s是好还是坏?

C# 正在将WPF应用程序拆分为多个dll';s是好还是坏?,c#,.net,wpf,dll,exe,C#,.net,Wpf,Dll,Exe,以前,作为一个.exe文件,我的WPF应用程序大小为4096KB 现在,我已经像这样将应用程序拆分为多个 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.Con

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

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

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
我进一步考虑通过将viewmodels从JIMS.exe中删除到JIMS.ViewModel.dll中,再添加两个dll

现在我的问题是,这是一种将单个EXE写入多个DLL的好方法吗

请让我知道这有什么优点和缺点

我有一些看法,比如,如果有更多的DLL,JIMS.exe将很难使用该应用程序联系到许多DLL。因为对于每个调用,它必须读取相应的DLL


提前感谢。

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

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

动态通话的好处

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

  • 每个动态调用的子例程必须作为DLL链接(除非使用导入库公开DLL中的其他入口点)。因此,如果您的应用程序由数百个子例程组成,并且它们都是动态调用的,那么您将需要分发数百个DLL
  • 您可以混合使用不同版本的DLL。这可能是分发应用程序和最终用户不正确安装更新的问题
  • 如果某个DLL丢失,则在用户尝试调用该DLL之前,您可能不知道该DLL。此时,除非您处理这种情况,否则应用程序将异常终止
  • 如果你调用一个DLL,取消它,然后再调用它,你会招致更多的I/O,因为如果你取消它,例程需要重新加载。这会降低应用程序的速度,因为它需要更多的磁盘活动。同样,在Windows环境中,这通常是不必要的,因为Windows在管理内存方面做得很好
  • 如果混合并匹配对同一子例程的静态和动态调用,那么您的软件可能同时在内存中有几个不同的版本。猜猜调试这些乱七八糟的东西会有多有趣
  • 有关更多信息,请参见

    它有许多好处:

    -如果你正在做一个小的更新,你的用户不需要下载完整的exe,他们只需要下载一些DLL,这些DLL要小得多 -如果您正在编写另一个使用dll的程序,则用户可以节省内存 -如果你的程序变得庞大,并且你有几分钟的构建时间,你不必全部重新构建,如果你正在进行更改,你可以重新构建更改后的dll

    但它也有一些负面观点: -你的用户可以删除DLL(如果他们真的很愚蠢的话),然后想知道为什么这个程序不再工作了 -没有DLL,用户可以快速构建便携版本


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

    我没有看到提到过,所以我会插手

    根据我的经验,在C#中使用这种方法的主要原因是可交换性——以便能够轻松地替换系统的某些部分

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


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

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


    对我来说,这感觉像是MVVM的一大好处,特别是如果您将组件分解为单独的项目/库。

    我们目前正在开发一个针对特定利基市场的大规模应用程序,但我们的许多客户需要定制的小型应用程序,这些应用程序在满足其需求的同时,他们经常使用产品的许多不同功能,这些功能使用单个数据库。因此,我们将Wpf应用程序拆分为许多不同的