CLR通常处理两种二进制文件:
程序的文件名以.exe结尾,在PE标题中标记为程序,并有一个入口点。
库的文件名以.dll结尾,在PE头中标记为库,没有入口点,并且具有描述其包含的可调用函数的元数据。
这种区别的哪些部分实际上是强制执行的?
例如,我认为除了命令搜索路径之外,文件名中的扩展名实际上并不重要;一旦读取文件,将忽略文件名,只有PE头计数。这是对的吗?
你能把一个程序当作一个库来对待它,从另一个程序引用它并调用它的一些函数而不使用它的入口点吗?
图书馆可以有入口点吗?如果是这样,它可以像程序一样运行吗?
答案 0 :(得分:2)
我知道,至少你可以从其他程序集引用.NET可执行程序集,只要它们有一个可用的公共API,当然。我以前做过这个。
据我所知,库不能像程序一样运行,因为,为了做到这一点,Windows必须将其识别为可执行文件,因为它的文件扩展名不会。
答案 1 :(得分:1)
如果您创建.Net类库,请添加Main方法并将输出dll重命名为exe,它将不会运行。正如您所述,PE头未正确设置以供执行。您可以将.Net程序视为.Net库。最终两者都只是声明类型的托管程序集。
总结一下。只能直接执行托管应用程序。可以引用任何托管程序集并使用它的类(假设框架版本兼容性,类型可见性等)
但是,如果您处于这种情况,将exe引用为库,则应该考虑将常用功能拆分为许多应用程序可以引用的库。应用程序永远不需要在其他应用程序中引用代码。