为什么C#没有C ++风格的静态库?

最近我一直在研究一些共享一些常见代码的小.NET应用程序。 代码中引入了一些接口来抽象出用于unit testing的I / O调用。

我希望应用程序是独立的EXE,没有外部依赖性。 这似乎是静态库的完美用例。 想想第三方控制供应商也可以从这个模型中受益。

我错过了一些隐藏的静态库吗?

有没有理由让C#设计师把它们排除在外?

编辑:我知道ILMerge,但它不提供与静态库相同的便利。

.NET确实支持静态库的道德等价物。 它被称为netmodule(文件扩展名通常是.netmodule)。 在这篇博文中了解更多相关信息 。 请注意,Visual Studio构建工具链不能很好地支持它。 我认为扩展方法也是一个问题。 ILMerge是完成这项工作的更好工具。

这与C#没有直接关系,而是与整个.NET保护伞有关。 当然,可以使用ILMerge合并组件,但是它仍然是一个研究项目,但至少它的许可证允许用于商业努力。 除此之外,运行时(CLR)无法合并为单个可执行文件,目标平台仍需要安装.NET。

编辑:

我在用ILMerge编辑你的post之前输入了这个。 我可能错了,但在运行时避免.NET风格的动态链接没有额外的好处。 将附属程序集与可执行文件放在一起没有任何问题。 Microsoft不建议将它们放在GAC中。

使用静态库具有缺点,即运行时提供程序(MS)无法对其进行修补。

例如,如果您使用静态MFC库并且在MFC静态库中发现了安全问题或其他错误,则MS无法对其进行修补(代码已在您的可执行文件中)。 使用共享Dll可以在操作系统级别轻松修补,而无需关心。

当然,拥有共享库有一个小缺点:需要依赖,它们必须安装在系统上。