3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
這樣可以清除嗎?
// 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);
編輯:要回答您在修訂后的問(wèn)題中提出的問(wèn)題,您肯定想閱讀Suzanne Cook的Assembly Identity。
有很多規(guī)則控制程序集的加載方式,其中一些規(guī)則與如何解決依賴關(guān)系有關(guān)-如果您的AssemblyA依賴于AssemblyB,那么.NET在哪里可以找到AssemblyB?在全局程序集緩存中,它找到了AssemblyA所在的目錄,還是完全位于其他位置?此外,如果找到該程序集的多個(gè)副本,應(yīng)如何選擇要使用的那個(gè)副本?
LoadFrom有一套規(guī)則,而LoadFile有另一套規(guī)則。很難想象有很多使用原因LoadFile,但是如果您需要在同一程序集的不同副本上使用反射,那么反射就在那里。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
來(lái)自Suzanne Cook的博客:
LoadFile與LoadFrom
小心-這些不是同一回事。
LoadFrom()通過(guò)Fusion,可以重定向到其他路徑下的另一個(gè)程序集,但如果已經(jīng)在LoadFrom上下文中加載了同一組件,則具有相同的標(biāo)識(shí)。
LoadFile()根本不通過(guò)Fusion進(jìn)行綁定-加載程序僅繼續(xù)進(jìn)行并完全加載*調(diào)用者請(qǐng)求的內(nèi)容。它不使用Load或LoadFrom上下文。
因此,LoadFrom()通常會(huì)為您提供所需的內(nèi)容,但不一定如此。LoadFile()適用于那些真的非常想要確切的請(qǐng)求的人。(*但是,從v2開(kāi)始,策略將同時(shí)應(yīng)用于LoadFrom()和LoadFile(),因此LoadFile()不一定完全符合要求。此外,從v2開(kāi)始,如果具有其標(biāo)識(shí)的程序集位于GAC,將改用GAC副本。請(qǐng)使用ReflectionOnlyLoadFrom()完全加載所需的內(nèi)容-但是請(qǐng)注意,無(wú)法執(zhí)行以這種方式加載的程序集。)
LoadFile()有一個(gè)陷阱。由于它不使用綁定上下文,因此不會(huì)在其目錄中自動(dòng)找到其依賴項(xiàng)。如果它們?cè)贚oad上下文中不可用,則必須訂閱AssemblyResolve事件才能綁定到它們。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
經(jīng)過(guò)反復(fù)的努力,今天下午我自己發(fā)現(xiàn)了一個(gè)不同之處。
我想在運(yùn)行時(shí)加載一個(gè)DLL,并且該DLL位于另一個(gè)目錄中。該DLL具有自己的依賴項(xiàng)(DLL),這些依賴項(xiàng)也位于同一目錄中。
LoadFile():加載特定的DLL,但不加載依賴項(xiàng)。因此,當(dāng)?shù)谝淮螐腄LL內(nèi)部調(diào)用到其他DLL中的一個(gè)時(shí),它引發(fā)了FileNotFoundException。
LoadFrom():加載我指定的DLL以及該目錄中存在的所有依賴項(xiàng)。
- 3 回答
- 0 關(guān)注
- 766 瀏覽
添加回答
舉報(bào)