对于上面所有的好建议,同意。话虽如此,也许存在通常不需要外部 DLL 的有效场景?所以这就是你要做的。你包装和隔离它们。(它比创建接口的抽象级别更高,因此更容易维护)。
在 Visual Studio 中,如果您不重新编译引用外部 DLL 的特定 VS 项目,那么您可以在不使用这些 DLL 的情况下编译其余的 VS 解决方案项目。因此,如果您以某种方式用自己的 DLL 包装外部 DLL,然后仅将这些包装器分发为二进制文件,那么共享您的源代码的人将不需要外部 DLL 来编译主要解决方案。
注意事项: 1. 将包装代码分离成独立项目的额外工作。2. 其他 VS 项目必须添加对包装 DLL 的引用作为对“LIB”文件夹的“文件系统”引用,而不是“项目引用”。3. VS 解决方案配置必须禁用包装 DLL 的编译。如果需要,应添加新配置以显式重新编译它们。4. 每个 Wrapper DLL 的 VS 项目定义应包含一个构建后事件,以将它们复制到预期的“LIB”文件夹位置。5. 在运行时,外部 DLL 必须存在于应用程序的 bin 目录或机器的 GAC 中,或者以其他方式显式加载。注意:如果它们丢失,只有当它们在运行时实际调用时,它们的缺失才会导致运行时错误。IE 如果代码在一般情况下没有碰巧调用它们,则不需要它们。6. 在运行时,您可以捕获加载外部 DLL 的错误并向用户显示一个漂亮的错误消息,说“要使用此功能,请安装以下产品:xyz”。这比显示“AssemblyLoadException... 请使用 FusionLogViewer... 等”更好。 7. 在应用程序启动时,您可以测试和检测丢失的 DLL,然后禁用依赖它们的特定功能。
例如:根据这种模式,我可以有一个与 Microsoft CRM 和 SAP 集成的应用程序,但仅限于特定功能,即导入/导出。
在设计时,如果开发人员从不需要更改包装器,他们将能够在没有这些外部 DLL 的情况下重新编译。在运行时,如果用户从不调用此函数,则应用程序将永远不会调用包装器,因此不需要外部 DLL。