2012-03-06 72 views
2

如果我使用反射來檢索程序集,它將搜索程序集並將其緩存。我可以這樣說,因爲如果它找不到組件,即使將它添加到正確的位置,它也不會找到它。如果它找到該程序集並將其刪除,它仍然使用它找到並緩存的程序集。如何清除.NET的反射緩存?

我知道我不是有這個問題只有一個:Clear .Net Reflection cache

我用得到彙編代碼如下 - 我做這個調用每次(不緩存我自己):

// Try to get the assembly referenced. 
Assembly reflectedAssembly; 
try 
{ 
    reflectedAssembly = Assembly.Load(assembly); 
} 
catch (FileNotFoundException) 
{ 
    errorMessage = string.Format("Could not find assembly '{0}'", assembly); 
    result = null; 
    return false; 
} 

我想知道的是,如果有一種方法可以在不重新啓動進程的情況下清除反射緩存。任何幫助將不勝感激。

在此先感謝!

+0

使用'Assembly.LoadFrom'也許? – 2012-03-06 21:47:45

+0

你傳遞給Assembly.Load的是什麼?一個字符串?一個字節數組?一個AssemblyName實例? – Fernando 2012-03-06 22:32:06

+0

@Fernando - 我正在傳遞一個字符串:「ClassLibrary1,Version = 1.0.0.0,Culture = Neutral,PublicKeyToken = d48aa85d4ceaf047」 – zimdanen 2012-03-07 14:41:44

回答

4

您無法卸載.Net中的程序集 - 但可以關閉應用程序域(這是裝入程序集的位置)。

+3

不完全正確。有一種特殊的組件可以卸載。但從文件加載的程序集永遠不會被卸載。 http://msdn.microsoft.com/en-us/library/dd554932.aspx也可以通過它們在AppDomain之間共享的方式加載程序集,並且不要因爲卸載其中一個而卸載。 – CodesInChaos 2012-03-06 21:55:52

+0

「程序集加載反射散射是加載可收集組件的唯一機制,不能卸載由任何其他形式的程序集加載的程序集。」 來自文章鏈接。所以,要卸載,我必須動態生成程序集。 感謝你們的答案 - 我想要做的是不可能的。 – zimdanen 2012-03-07 15:05:36

+0

儘管卸載的概念與加載從未加載過的概念有點不同 - 但如果一次失敗,緩存不會嘗試再次獲取它。 (雖然可能是同一概念的一部分 - 它將保持操作的結果,而不管它們是什麼。) – zimdanen 2012-03-07 15:07:54