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

时间:2009-12-02 20:59:07

标签: c# c++ static-libraries

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

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

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

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

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

3 个答案:

答案 0 :(得分:11)

事实上,.NET确实支持静态的道德等价物 图书馆。它被称为netmodule(文件扩展名通常是 .netmodule)。在此blog post中了解有关它的更多信息。 请注意,Visual Studio不能很好地支持它 建立工具链。我认为extension methods是一个 问题也是如此。 ILMerge是获得此功能的更好工具 完成。

答案 1 :(得分:3)

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

编辑:

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

答案 2 :(得分:1)

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

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

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