12

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

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

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

C# 设计者有什么理由将它们排除在外吗?

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

4

3 回答 3

11

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

于 2009-12-02T21:58:08.823 回答
3

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

编辑:

在您使用 ILMerge 编辑帖子之前,我正在输入此内容。我可能错了,但在运行时避免使用 .NET 样式的动态链接并没有额外的好处。将附属程序集与可执行文件放在一起没有任何问题。Microsoft 不建议将它们放入 GAC。

于 2009-12-02T21:04:54.340 回答
1

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

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

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

于 2009-12-02T21:07:16.023 回答