【问题标题】:Why does C# not have C++ style static libraries? [closed]为什么 C# 没有 C++ 风格的静态库? [关闭]
【发布时间】:2009-12-02 20:59:07
【问题描述】:
最近我一直在开发一些共享一些通用代码的小型 .NET 应用程序。该代码引入了一些接口来抽象出I/O 单元测试调用。
我希望应用程序是独立的 EXE,没有外部依赖项。这似乎是静态库的完美用例。想想看,第三方控制供应商也可以从这种模式中受益。
静态库中是否有一些我遗漏的隐藏问题?
C# 设计者有什么理由将它们排除在外吗?
编辑:我知道 ILMerge,但它没有提供与静态库相同的便利。
【问题讨论】:
标签:
c#
c++
static-libraries
【解决方案1】:
.NET 实际上确实支持静态的道德等价物
图书馆。它被称为网络模块(文件扩展名通常是
.net 模块)。在blog post 中了解更多信息。
请注意,Visual Studio 不太支持它
构建工具链。我认为extension methods 是
问题也是如此。 ILMerge 是获得此功能的更好工具
完成。
【解决方案2】:
这与 C# 没有直接关系,而是与整个 .NET 保护伞相关。当然,可以使用ILMerge 合并程序集,但可惜它仍然是一个研究项目,但至少它的许可证允许用于商业活动。除此之外,运行时 (CLR) 无法合并为单个可执行文件,目标平台仍需要安装 .NET。
编辑:
在您使用 ILMerge 编辑帖子之前,我正在输入此内容。我可能错了,但在运行时避免使用 .NET 样式的动态链接并没有额外的好处。将附属程序集与可执行文件放在一起没有任何问题。 Microsoft 不建议将它们放入 GAC。
【解决方案3】:
使用静态库的缺点是运行时提供程序 (MS) 无法对其进行修补。
例如,如果您使用静态 MFC 库并且在 MFC 静态库中发现了安全问题或其他错误,MS 无法对其进行修补(代码已经在您的可执行文件中)。使用共享 Dll 可以在操作系统级别轻松打补丁,而无需您关心。
当然,共享库有一个小缺点:需要依赖并且必须在系统上安装它们。