GetEntryAssembly和GetExecutingAssembly的区别

14
我已经阅读了 GetEntryAssemblyGetExecutingAssembly 的文档,试图理解它们之间的区别。但是我无法理解这两个定义之间的关系。虽然我看到了两种不同的表述方式,但我无法理解所暗示的差异。在我的脑海中,这就像是一个“你说马铃薯,我说土豆”的情况,当我尝试显示每个返回的Assemby对象的值时,这种感觉更加强烈。
自然地,它们之间必须有一些不同,只是我的能力不足以意识到它是什么。因此,我进行了一些研究,只发现大部分智慧关于获取路径的内容。唯一明确针对它们之间比较的资源是这里
请问能否提供一个特定的例子,在这两种方法返回的对象内容不同的情况下?最好附带简要说明原因。

GetEntryAssembly 将始终返回最先执行的程序集的名称(通常是可执行文件的名称),而 GetExecutingAssembly 返回包含实际执行代码的程序集的名称。 - Gusman
请参阅 https://dev59.com/3WUp5IYBdhLWcg3wPFz_#18216908 和 https://dev59.com/IF8d5IYBdhLWcg3wNAKy:~:text=GetExecutingAssembly%20returns%20the%20assembly%20where,may%20not%20be%20your%20executable。 - Ian Ringrose
2个回答

22
假设您有一个控制台项目MyConsoleProject,它引用库项目MyLibrary

MyConsoleProject内,入口和执行程序集将是相同的。但在MyLibrary中,执行程序集将指向库项目,而不是控制台项目。

啊,那么对于网络项目(通常由一个带有WebApi的单个项目组成),通常没有区别,是吗?在我知道项目不会与外部库交互的情况下,哪个选项是最直观的第一选择?实际上,它们将产生相同的结果,但我感觉其中一个是主要选择,除非需要另一个。你怎么看? - Konrad Viltersten
我认为,一旦你知道它们之间的区别,你就会相应地使用它们。 - Tomas Chabada
也许我在后续中没有表达清楚。现在,由于您的回答,我确实理解它们之间的区别。然而,我想听听您主观上认为在应用程序的已知范围可以互换使用时,您会发现哪一个最有用。 - Konrad Viltersten
大部分时间,我发现 GetEntryAssembly 是第一选择,然后在特定情况下使用 GetExecutingAssembly - Tomas Chabada

4

GetExecutingAssembly:

获取当前正在执行代码的程序集。

GetEntryAssembly 返回:

包含在默认应用程序域中进程可执行文件或由ExecuteAssembly(String)执行的第一个可执行文件的程序集。从非托管代码调用时可能返回 null。

当从非托管应用程序加载了托管程序集时,GetEntryAssembly 方法可能会返回 null。例如,如果非托管应用程序创建了一个由 C# 编写的 COM 组件实例,则从该 C# 组件调用 GetEntryAssembly 方法将返回 null,因为该进程的入口点是非托管代码而不是托管程序集。

参考文献:


关于我对其他答案的评论,你会在执行程序集始终与入口程序集相符的应用程序中直观地预期哪个呢?在一个较小的应用程序中,例如。我现在理解它们的作用和区别了。但我想听听别人的意见,哪一个是“默认”的,或者至少被认为是这样,因为这可能是一个主观的品味和...嗯...意见的问题。 - Konrad Viltersten
OP已经说过他读了文档,所以只是引用确切的文本可能不会有太大帮助。这只是我的个人意见。 - Christian.K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接