在.NET开发中,程序集加载是一个常见但复杂的话题。程序集是.NET应用程序的基本构建块,它们包含了可执行代码和资源。在开发过程中,经常需要将多个程序集加载到应用程序中。本文将探讨.NET中几种不同的程序集加载方法,包括Assembly.Load()
、Assembly.LoadFrom()
和Assembly.LoadFile()
,并回答一些关于程序集加载的常见问题。
在.NET中,有几种方法可以加载程序集。以下是三种主要的方法:
Assembly.Load()
:此方法接受一个完全限定的程序集名称,并使用.NET定义的算法来搜索程序集。Assembly.LoadFrom()
:此方法接受程序集的完整路径。如果调用此方法,它将加载程序集到应用程序域中,前提是它没有被此方法或任何其他方法从同一路径加载过。Assembly.LoadFile()
:这是一种更为“懒惰”的方法,它尽量减少工作量,不进行任何搜索。如果调用此方法,它将每次都加载程序集到AppDomain
中。接下来,让回答一些关于程序集加载的问题。
问题1:可以在特定的AppDomain
中加载同一个程序集的多个版本吗?
问题2:可以拥有两个相同程序集的副本吗?如果可以,哪个加载的程序集将具有优先级?
问题3:可以在应用程序域中加载n个相同程序集的副本吗?在这种情况下,系统将如何表现?
在回答这些问题之前,让先了解一下上述方法的作用。
Assembly.Load()
方法接受一个完全限定的程序集名称,并使用.NET定义的算法来搜索程序集。使用此方法,只能加载单个版本的程序集一次。
Assembly.LoadFrom()
方法接受程序集的完整路径。如果调用此方法,它将加载程序集到应用程序域中,前提是它没有被此方法或任何其他方法从同一路径加载过。这意味着,如果程序集已经被加载过,即使从不同的路径尝试加载相同的程序集,也不会再次加载。
Assembly.LoadFile()
方法是一种更为“懒惰”的方法。它尽量减少工作量,不进行任何搜索。如果调用此方法,它将每次都加载程序集到AppDomain
中。但是,如果给定的路径相同,它不会再次从同一路径加载程序集。
根据上述方法,可以至少两次加载一个程序集,即使这些程序集中的所有内容都是相同的。
在.NET中,如果尝试加载同一个程序集的多个版本,系统将根据加载方法的优先级来决定使用哪个版本。以下是一些规则:
Assembly.LoadFrom()
方法加载了程序集,那么即使使用Assembly.Load()
方法尝试加载相同版本的程序集,也不会再次加载。Assembly.LoadFile()
方法加载了程序集,那么即使使用Assembly.Load()
或Assembly.LoadFrom()
方法尝试加载相同版本的程序集,也不会再次加载。因此,在使用这些方法时,应该始终依赖于Assembly.Load()
方法。如果知道程序集的路径不在.NET搜索路径中,请使用Assembly.LoadFrom()
方法。但在这种情况下,应该使用AppDomain.GetAssemblies()
方法检查程序集是否已经被加载到AppDomain
中。