LoadFile和LoadFrom与.NET程序集之间的区别?

Xai*_*oft 119 .net assemblies assembly-loading system.reflection

我正在查看msdn文档,我仍然对使用LoadFileLoadFrom加载程序集之间的区别究竟有点困惑.有人可以提供一个例子或类比来更好地描述它.MSDN文档让我更加困惑.此外,它是ReflectionOnlyLoadFrom相同的,LoadFrom只是它只在反射模式下加载程序集.

由于我的.NET经验并不是最好的,因此以下是有关使用LoadFile的MSDN文档的一些问题:

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

2)它声明LoadFile不会将文件加载到"LoadFrom上下文"中,并且不会使用加载路径解析依赖关系.这是什么意思,有人可以提供一个例子吗?

3)最后,它声明LoadFile在这种有限的场景中很有用,因为LoadFrom无法加载具有相同身份但路径不同的程序集; 它只会加载第一个这样的组件,这再次带给我同样的问题,组件标识是什么?

Jef*_*nal 92

这清楚了吗?

// 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);
Run Code Online (Sandbox Code Playgroud)

编辑:为了回答你在修改过的问题中提出的问题,你肯定想在集会身份上阅读Suzanne Cook.

有很多规则可以控制程序集的加载方式,其中一些规则与它们如何解决依赖关系有关 - 如果你的AssemblyA依赖于AssemblyB,.NET应该在哪里找到AssemblyB?在全局程序集缓存中,它找到AssemblyA的相同目录,还是完全在其他地方?此外,如果它找到该程序集的多个副本,它应该如何选择使用哪个?

LoadFrom有一套规则,而LoadFile另一套规则.很难想象有很多理由可以使用LoadFile,但是如果你需要在同一个组件的不同副本上使用反射,它就在你身边.

  • CodeBase与身份相同吗? (2认同)

Cra*_*gTP 60

来自Suzanne Cook的博客:

LoadFile与LoadFrom

小心 - 这些不是一回事.

LoadFrom()通过Fusion,可以重定向到另一个路径,但是如果已经在LoadFrom上下文中加载了相同的身份,则可以使用相同的身份.

LoadFile()根本没有通过Fusion绑定 - 加载器只是继续并正好加载*调用者请求的内容.它不使用Load或LoadFrom上下文.

因此,LoadFrom()通常会为您提供所要求的内容,但不一定如此.LoadFile()适用于那些真正非常想要的人.(*但是,从v2开始,策略将应用于LoadFrom()和LoadFile(),因此LoadFile()不一定完全是请求的内容.另外,从v2开始,如果具有其标识的程序集在GAC,将使用GAC副本.使用ReflectionOnlyLoadFrom()来加载您想要的 - 但是,请注意,无法执行以这种方式加载的程序集.)

LoadFile()有一个catch.由于它不使用绑定上下文,因此不会在其目录中自动找到其依赖项.如果它们在Load上下文中不可用,则必须订阅AssemblyResolve事件才能绑定它们.

看到这里.

另请参阅在同一博客上选择绑定上下文文章.


Lor*_*ore 42

经过多次头疼,我今天下午发现了自己的不同之处.

我想在运行时加载DLL,DLL住在另一个目录中.该DLL有自己的依赖项(DLL),它们也存在于同一目录中.

LoadFile():加载特定的DLL,但不加载依赖项.因此,当第一次调用从DLL内部发送到其他DLL之一时,它会抛出FileNotFoundException.

LoadFrom():加载我指定的DLL以及该目录中的所有依赖项.

  • 这正是我的问题!我在创建一个由我刚装载`.LoadFile`的程序集引用的程序集中定义的对象的新实例时得到了`FileNotFoundException`.将此更改为`.LoadFrom`似乎解决了问题,但我不知道为什么!谢谢 (4认同)