我正在查看msdn文档,但对于加载程序集时使用LoadFileLoadFrom的区别,我仍然有点困惑.有人能提供一个例子或类比来更好地描述它吗.MSDN文档让我更加困惑.此外,Is ReflectionOnlyLoadFromLoadFrom相同,只是它仅在反射模式下加载部件.

自从我.NET体验并不是最好的,以下是关于使用LoadFile的MSDN文档的一些问题:

1)LoadFile判断具有相同标识但位于不同路径的程序集是什么意思?身份是什么(示例)?

2)它声明LoadFile不会将文件加载到"LoadFrom Context"中,也不会使用加载路径解析依赖项.这是什么意思,有人能举个例子吗?

3)最后,它指出LoadFile在这个有限的场景中很有用,因为LoadFrom不能加载具有相同标识但路径不同的程序集;它将只加载第一个这样的程序集,这再次给我带来了同样的问题,程序集标识是什么?

推荐答案

这能澄清问题吗?

// path1 and path2 point to different copies of the same assembly on disk:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the assembly from path1, so this is true
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

assembly1 = Assembly.LoadFile(path1);
assembly2 = Assembly.LoadFile(path2);

// These point to different assemblies now, so this is false
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

Edit:要回答你在修改后的问题中提出的问题,你一定要读Suzanne Cook on Assembly Identity.

控制如何加载程序集的规则很多,其中一些规则与它们如何解析依赖项有关-如果你的AssemblyA依赖于AssemblyB,那么.NET应该在哪里找到AssemblyB呢?在全局程序集缓存中,与它找到的AssemblyA相同的目录,还是完全不同的目录?此外,如果它找到该程序集的多个副本,它应该如何 Select 要使用的副本?

LoadFrom有一套规则,而LoadFile有另一套规则.很难想象使用LoadFile的原因有很多,但是如果您需要在同一程序集的不同副本上使用反射,它就在那里.

.net相关问答推荐

dotnet 8 web api在部署到docker后无法工作

WinForm Task.Wait :为什么它会阻塞 UI?

在 Inno Setup 中判断给定服务的依赖服务

Dotnet 反射:使用 F# 中的out参数调用 MethodInfo 上的调用

cmd 冻结中的 dotnet 命令.怎么了?

在 .NET 中使用 AES 解密时缺少后半字节

在 Git for Visual Studio 2012 中恢复到以前的提交

AsyncLocal 的语义与逻辑调用上下文有何不同?

判断 Windows 路径中是否存在可执行文件

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

是否有 Linq 方法可以将单个项目添加到 IEnumerable

是否可以在 XP 上运行 .NET 4.5 应用程序?

使用+运算符的字符串连接

判断对象列表是否包含具有特定值的属性

是 C# 中的 bool 读/写原子

根据条件从列表中删除项目

作者主签名的时间戳发现了一个建链问题:UntrustedRoot: self-signed certificate in certificate chain

WPF中的依赖属性和附加属性有什么区别?

在 C#/.NET 中合并两个图像

.NET 桌面应用程序中的 Settings.settings 与 app.config