2012-03-06 116 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