1. Assembly.Load()
简介
Load()方法接收一个String或AssemblyName类型作为参数,这个参数实际上是需要加载的程序集的强名称(名称,版本,语言,公钥标记)。例如.NET 2.0中的FileIOPermission类,它的强名称是:
System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
对于弱命名的程序集,则只会有程序集名称,而不会有版本,语言和公钥标记。如 TestClassLibrary
细节
- CLR内部普遍使用了Load()方法来加载程序集,在Load()方法的内部,CLR首先会应用这个程序集的版本绑定重定向策略,接着在GAC中查找目标程序集。如果GAC中没有找到,则会在应用程序目录和子目录中寻找(应用配置文件的codebase所指定的位置)。
- 如果希望加载弱命名程序集,Load()方法就不会去GAC中查找。
- 当Load()找到目标程序集时,就会加载它,并返回一个相应Assembly对象的引用。
- 当没有找到程序集时,会抛出System.IO.FileNotFoundException异常。
- 当存在特定CPU架构的程序集时,CLR会优先加载当前架构的程序集(例如x86版本优先于IL中立版本)
- 如果希望强迫加载某个架构版本的程序集,需要在强名称中加以指定。ProcessorArchitecture可以为x86 IA64 AMD64或MSIL,当然还有None
- Load方法与Win32函数中的LoadLibrary方法等价
2. Assembly.LoadFrom()
简介
LoadFrom()方法可以从指定文件中加载程序集,通过查找程序集的AssemblyRef元数据表,得知所有引用和需要的程序集,然后在内部调用Load()方法进行加载。
Assembly.LoadFrom(@"C:\ABC\Test.dll");
细节
- LoadFrom()首先会打开程序集文件,通过GetAssemblyName方法得到程序集名称,然后关闭文件,最后将得到的AssemblyName对象传入Load()方法中
- 随后,Load()方法会再次打开这个文件进行加载。所以,LoadFrom()加载一个程序集时,会多次打开文件,造成了效率低下的现象(与Load相比)。
- 由于内部调用了Load(),所以LoadFrom()方法还是会应用版本绑定重定向策略,也会在GAC和各个指定位置中进行查找。
- LoadFrom()会直接返回Load()的结果——一个Assembly对象的引用。
- 如果目标程序集已经加载过,LoadFrom()不会重新进行加载。
- LoadFrom支持从一个URL加载程序集(如"http://www.abc.com/test.dll"),这个程序集会被下载到用户缓存文件夹中。
- 从URL加载程序集时,如果计算机未联网,LoadFrom会抛出一个异常。如果IE被设置为“脱机工作”,则不会抛出异常,转而从缓存中寻找已下载的文件。
3. Assembly.LoadFile()
简介
LoadFile()从一个指定文件中加载程序集,它和LoadFrom()的不同之处在于LoadFile()不会加载目标程序集所引用和依赖的其他程序集。您需要自己控制并显示加载所有依赖的程序集
细节
- LoadFile()不会解析任何依赖
- LoadFile()可以多次加载同一程序集
- 显式加载依赖程序集的方法是,注册AppDomain的AssemblyResolve事件
下面是一些可能的区别,但请注意,具体含义可能依赖于特定的编程语言或框架:
-
上下文:
LoadFrom
通常指的是从某个源加载数据或资源,这个源不一定是文件系统上的文件,也可能来自网络、数据库或其他数据源。LoadFile
明确指的是从文件系统中加载文件。
-
参数类型:
LoadFrom
可能接受不同类型的参数,比如文件路径、URL、数据库连接字符串等,具体取决于其实现。LoadFile
通常只接受文件路径作为参数。
-
功能范围:
LoadFrom
可能包含更广泛的功能,比如解析不同的数据格式、处理网络请求等。LoadFile
的功能通常限于读取和解析文件。
-
错误处理:
LoadFrom
可能需要更复杂的错误处理逻辑,因为它可能涉及多种数据源和格式。LoadFile
的错误处理可能更简单,主要关注文件访问和读取错误。
-
用途:
LoadFrom
可能用于更通用的资源加载场景,不局限于文件。LoadFile
通常用于需要读取本地或网络文件的场景。
-
实现细节:
LoadFrom
的实现可能包含更多的逻辑来确定数据源的类型,并根据类型调用不同的加载方法。LoadFile
的实现可能更直接,主要是调用文件系统的API来读取文件。
在某些编程环境或库中,LoadFrom
和 LoadFile
可能是同一个类或函数的不同重载,或者它们可能是完全不同的函数,具有不同的用途和实现。如果你在使用特定的编程语言或框架,并希望了解这些术语的确切含义和用法,提供更多的上下文将有助于给出更准确的解释。