Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET程序集-可执行和静态-混淆_.net_Assemblies - Fatal编程技术网

.NET程序集-可执行和静态-混淆

.NET程序集-可执行和静态-混淆,.net,assemblies,.net,Assemblies,我只处理web应用程序,因此我几乎没有在.NET中设计Windows窗体的实际经验 我在读汇编,有两种类型;静态,以.dll形式出现,可执行,以.exe形式出现 据我所知,“可执行程序集”只是编译应用程序(即控制台应用程序或Windows窗体应用程序)的另一个名称 你能澄清一下吗 编辑:我的术语来源于本文: 编辑2:好的,现在,据我所知,您有静态和动态程序集,静态存在于磁盘上,动态是动态/按需创建的。 其次,您有可执行程序集,它们是我们的应用程序,例如控制台应用程序,如helloworld.ex

我只处理web应用程序,因此我几乎没有在.NET中设计Windows窗体的实际经验

我在读汇编,有两种类型;静态,以.dll形式出现,可执行,以.exe形式出现

据我所知,“可执行程序集”只是编译应用程序(即控制台应用程序或Windows窗体应用程序)的另一个名称

你能澄清一下吗

编辑:我的术语来源于本文:

编辑2:好的,现在,据我所知,您有静态和动态程序集,静态存在于磁盘上,动态是动态/按需创建的。
其次,您有可执行程序集,它们是我们的应用程序,例如控制台应用程序,如
helloworld.exe

我从来没有听说过用于可执行文件或类库的术语“静态程序集”。基本上,.NET程序集可以有一个入口点。具有入口点且可直接从操作系统shell(更准确地说是CLI运行时)执行的文件是“.exe”文件,而没有入口点且仅用作其他应用程序的支持库的文件则存储为“.dll”文件

更新: 查看您提供的参考,很清楚“静态程序集”的含义:

程序集可以是静态的,也可以是动态的。静态程序集可以包括.NET Framework类型(接口和类)以及程序集的资源(位图、JPEG文件、资源文件等)。静态程序集以可移植可执行文件(PE)的形式存储在磁盘上。您还可以使用.NET Framework创建动态程序集,这些程序集直接从内存运行,在执行之前不会保存到磁盘。可以在动态程序集执行后将其保存到磁盘


MSDN文章将存储为磁盘上文件的程序集称为“静态程序集”,而不是由某些代码(例如命名空间中的类)在运行时生成的“动态程序集”。不管它们是DLL还是EXE(这两种文件类型都有一个可移植可执行文件(PE)头和一个CLR头)。唯一重要的是它们不是动态生成的(因此称为“静态”),而是以前存储在磁盘上的。在动态生成程序集的上下文之外,很少使用术语“静态程序集”。

在.NET世界中,差异非常小。exe只是使用/target:winexe编译器选项编译的程序集,它的一种类型中包含一个静态Main()方法。与DLL类型的程序集不同,使用/target:library选项编译

拥有一个入口点对于.exe非常重要,这是程序开始执行的地方。每个Windows程序都是这样启动的。在ASP.NET应用程序中看不到它,运行代码的.exe是iis.exe

更让您困惑的是,在.NET中编译为.exe的程序集与.dll一样有效。您只需在代码中使用Assembly.LoadFrom(),就可以访问.exe模块中的所有类型,就像在.dll模块中一样


关键的一点是,如果CLR不是由其他一些可执行进程托管的,比如ASP.NET、SQL server、MMC或大量利用CorBindToRuntimeEx()的程序,那么您需要告诉.NET代码从哪里开始执行。要点是它从Main()开始。

术语“static”通常不用于DLL程序集(事实上,D代表dynamic!)。我通常听说它们被称为“库”或“类库”。重新编辑:在那篇文章中,磁盘上的类库和可执行程序集都是“静态”的。也就是说,如果你看到一个DLL或EXE文件,那么它就是“静态”的。“动态”程序集是动态生成的(例如,使用Reflection.Emit;某些组件(如XmlSerializer)在使用时也会生成动态程序集),而不是保存到磁盘。您可以发出动态可执行程序集,但根据Mehrdad的回答,一旦进入内存级别,两者之间就没有太大区别!因此动态程序集最有可能是动态创建的,并且是按需创建的?要添加到您的回答中,可以使用“/t:winexe”或“/t:exe”创建exe。他们基本上在程序集标题中设置了一个“subsystem”(子系统)标志,告诉操作系统在运行程序集时是否显示外壳窗口控制台应用程序或winforms应用程序是否可以被视为.exe程序集?@maxp:yes。启动控制台或winforms应用程序的以.exe结尾的文件可以被视为可执行(exe)程序集。