最近我一直在研究一些共享一些常用代码的小.NET应用程序。代码中引入了一些接口来抽象I/O调用单元测试。
我希望应用程序是独立的EXE,没有外部依赖关系。这似乎是静态库的完美用例。想想第三方控制供应商也可以从这个模型中受益。
我错过了一些隐藏的静态库吗?
有没有理由让C#设计师将它们排除在外?
编辑:我知道ILMerge,但它没有提供与静态库相同的便利。
答案 0 :(得分:11)
答案 1 :(得分:3)
这与C#没有直接关系,而是与整个.NET保护伞有关。当然,可以使用ILMerge合并程序集,但是它仍然是一个研究项目,但至少它的许可证允许用于商业活动。除此之外,运行时(CLR)无法合并为单个可执行文件,目标平台仍需要安装.NET。
编辑:
我在用ILMerge编辑帖子之前输入了这个。我可能错了,但在运行时避免.NET风格的动态链接没有其他好处。将附属程序集与可执行文件放在一起没有任何问题。 Microsoft不建议将它们放在GAC中。
答案 2 :(得分:1)
使用静态库的缺点是运行时提供程序(MS)无法对其进行修补。
例如,如果您使用静态MFC库并且在MFC静态库中发现了安全问题或其他错误,则MS无法对其进行修补(代码已在您的可执行文件中)。使用共享Dll可以在操作系统级别轻松修补,而无需关心它。
当然,拥有共享库有一个小缺点:需要依赖,并且必须在系统上安装它们。