浅谈【.Net】Load、LoadFrom与LoadFile区别

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 AMD64MSIL,当然还有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事件

下面是一些可能的区别,但请注意,具体含义可能依赖于特定的编程语言或框架:

  1. 上下文

    • LoadFrom 通常指的是从某个源加载数据或资源,这个源不一定是文件系统上的文件,也可能来自网络、数据库或其他数据源。
    • LoadFile 明确指的是从文件系统中加载文件。
  2. 参数类型

    • LoadFrom 可能接受不同类型的参数,比如文件路径、URL、数据库连接字符串等,具体取决于其实现。
    • LoadFile 通常只接受文件路径作为参数。
  3. 功能范围

    • LoadFrom 可能包含更广泛的功能,比如解析不同的数据格式、处理网络请求等。
    • LoadFile 的功能通常限于读取和解析文件。
  4. 错误处理

    • LoadFrom 可能需要更复杂的错误处理逻辑,因为它可能涉及多种数据源和格式。
    • LoadFile 的错误处理可能更简单,主要关注文件访问和读取错误。
  5. 用途

    • LoadFrom 可能用于更通用的资源加载场景,不局限于文件。
    • LoadFile 通常用于需要读取本地或网络文件的场景。
  6. 实现细节

    • LoadFrom 的实现可能包含更多的逻辑来确定数据源的类型,并根据类型调用不同的加载方法。
    • LoadFile 的实现可能更直接,主要是调用文件系统的API来读取文件。

在某些编程环境或库中,LoadFromLoadFile 可能是同一个类或函数的不同重载,或者它们可能是完全不同的函数,具有不同的用途和实现。如果你在使用特定的编程语言或框架,并希望了解这些术语的确切含义和用法,提供更多的上下文将有助于给出更准确的解释。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN.LG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值