程序和库之间的区别

时间:2015-05-08 14:07:43

标签: .net clr cil

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

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

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

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

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

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

图书馆可以有入口点吗?如果是这样,它可以像程序一样运行吗?

2 个答案:

答案 0 :(得分:2)

我知道,至少你可以从其他程序集引用.NET可执行程序集,只要它们有一个可用的公共API,当然。我以前做过这个。

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

答案 1 :(得分:1)

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

总结一下。只能直接执行托管应用程序。可以引用任何托管程序集并使用它的类(假设框架版本兼容性,类型可见性等)

但是,如果您处于这种情况,将exe引用为库,则应该考虑将常用功能拆分为许多应用程序可以引用的库。应用程序永远不需要在其他应用程序中引用代码。