的LoadFile和LoadFrom与.NET程序集之间的区别是什么?(Difference bet

2019-07-19 15:15发布

我一直在寻找在MSDN文档,我仍对到底什么是两者的区别有点困惑LoadFileLoadFrom加载部件时。 有人可以提供一个例子或比喻来更好地描述它。 MSDN文档弄得我更多。 而且, ReflectionOnlyLoadFrom一样LoadFrom不同之处在于它加载组件仅在反射模式。

由于我的.NET的经验是不是最大的,这里有关于使用的LoadFile MSDN文档的一些问题:

1)这是什么意思LoadFile检查具有相同身份组件,但位于不同的路径? 什么是身份(例如)?

2)规定了LoadFile不会将文件加载到“LoadFrom上下文”并不能解决使用负载路径依赖。 这是什么意思,有人可以提供一个例子吗?

3)最后,它指出LoadFile因为LoadFrom无法加载具有相同身份但不同的路径组件是在这有限的场景中有用; 它只会加载第一个这样的组装,这又使我同样的问题,什么是组件的身份?

Answer 1:

这是否清除它呢?

// 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);

编辑 :回答你在经修订的课题提出的问题,你一定要读对大会的身份苏珊娜·库克 。

有很多的支配组件加载方式的规则,其中一些与他们如何解决依赖关系做 - 如果你的AssemblyA取决于AssemblyB,应该在哪里.NET去找找AssemblyB? 在全局程序集缓存,同一个目录就发现AssemblyA,或其他地方完全? 此外,如果发现该组件的多个副本,究竟应该如何选择使用哪一个?

LoadFrom都有一套规则,而LoadFile有另一套规则。 这是很难想象的原因有很多使用LoadFile ,但如果你需要在同一个组件的不同拷贝使用反射,它的存在给你的。



Answer 2:

从苏珊·库克的博客 :

主场迎战的LoadFile LoadFrom

要小心 - 这些都是不一样的东西。

LoadFrom()经过融合,并且如果一个在LoadFrom上下文已经加载可在不同的路径,但与相同的标识重定向到另一组件。

的LoadFile()不通过融合在所有绑定 - 装载机只是继续运行并装入准确*来电者要求什么。 它不使用任何负载或LoadFrom上下文。

所以,LoadFrom()通常给你你问什么,但不一定。 的LoadFile()是为那些谁真的,真的想到底是什么要求。 (*但是,在V2开始,政策将应用到LoadFrom()和的LoadFile(),这样的LoadFile()不一定会确切地被要求什么。此外,在V2开始,如果其身份的组件在海关总署,海关总署副本将被用来代替使用ReflectionOnlyLoadFrom()来加载你想要什么 - 。但是,请注意,组件加载不能执行的方式)

的LoadFile()有一个陷阱。 由于它不使用绑定上下文,它的依赖不会自动在目录中找到。 如果他们不是在负载情况下可用,你就必须订阅AssemblyResolve事件以绑定到他们。

见这里 。

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



Answer 3:

很多头刮后我发现一个区别自己这个下午。

我想在运行时加载DLL,以及DLL住在另一个目录。 该DLL有它自己的依赖(DLL)中,其也住在同一个目录。

的LoadFile():加载特定DLL,但不是依赖。 因此,当第一个电话是从DLL中作出的其他DLL的一个扔一个FileNotFoundException异常。

LoadFrom():加载我指定的DLL,并全部住在该目录中的依赖关系。



Answer 4:

一个区别,我注意到的是:

Assembly.LoadFile -加载组件在不同的应用程序域具有有限的用户权限(diffrence principel)。 像serilization / deserilization操作无法进行。

Assembly.LoadFrom -加载组件,其与相同的用户权限(相同principel)相同的AppDomain。



Answer 5:

注意:如果一个组件被使用8.3路径加载,然后从非8.3的路径,它们将即使它们是相同的物理DLL被看作是不同的组件,。



Answer 6:

.NET具有不同的负载情况下。 苏珊·库克写了关于他们在这里: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

这是净隔离引用不混合起来的方式。



Answer 7:

就我而言,我只是简单地删除位于@ ASP应用程序缓存C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files 。 当该网站是第一次运行它被重建。 请务必先停止IIS。

希望这可以帮助别人喜欢它为我做的。



文章来源: Difference between LoadFile and LoadFrom with .NET Assemblies?