程序和库的区别

Distinction between a program and library

CLR 通常处理两种二进制文件:

一个程序的文件名以 .exe 结尾,在 PE 中被标记为一个程序 header,并且有一个入口点。

库的文件名以 .dll 结尾,在 PE 中被标记为库 header,没有入口点,并且具有描述它包含的可调用函数的元数据。

这种区别的哪些部分实际上是强制执行的?

例如,我认为除了命令搜索路径外,文件名中的扩展名实际上并不重要;一旦文件被读取,文件名将被忽略,只有 PE header 才算数。这是正确的吗?

你能把一个程序当作一个库,从另一个程序引用它并调用它的一些函数而不使用它的入口点吗?

库可以有入口点吗?如果可以,能不能像程序一样运行?

我知道至少您可以从其他程序集中引用 .NET 可执行程序集,只要它们具有可用的 public API,当然。我以前做过。

据我所知,库不能 运行 像一个程序,因为,为了做到这一点,Windows 必须将它识别为可执行文件,而它不会' 因为它的文件扩展名。

如果您创建 .Net class 库,请添加 Main 方法并将输出 dll 重命名为 exe,它不会 运行。如您所述,PE header 未正确设置以执行。您可以将 .Net 程序视为 .Net 库。最终两者都只是声明类型的托管程序集。

综上所述。只能直接执行托管应用程序。可以引用任何托管程序集,并且它 class 被消耗(假设框架版本兼容性、类型可见性等)

但是,如果您处于这种情况,将 exe 作为库引用,是时候考虑将通用功能拆分到一个库中,供许多应用程序引用。应用程序永远不需要引用其他应用程序中的代码。