创建自己的.NET程序集缓存

时间:2009-04-04 04:11:22

标签: .net caching assemblies

在我写的.net应用程序中,我需要在本地缓存来自不同位置的程序集,这样即使原始位置不可用,我的应用程序也可以使用它们。我不能使用GAC(主要是因为我想要可移植性,也因为程序集可能没有签名)。

有没有人知道任何支持此功能的.net代码?我需要缓存能够告诉我特定程序集是否已经在缓存中并且还处理不同版本的程序集。我可能不得不求助于编写自己的汇编缓存,但我想我会问这个问题,因为如果已经完成,我真的不想“重新发明轮子”。

2 个答案:

答案 0 :(得分:2)

Mono project必须(重新)实施GAC,它适用于Windows。我会从那里开始。

答案 1 :(得分:2)

我最终必须编写自己的程序集缓存...

以下是它如何工作的基础知识,以便在需要实现自己的程序集缓存时帮助其他人:

  • 缓存是应用程序中具有相应包装类的文件夹。
  • 在高速缓存中安装程序集的方法返回一个字符串'token'(安装程序集的名称),调用者可以保存该名称并稍后用于检索程序集。
  • 检索程序集的方法接受令牌并返回一个封装高速缓存程序集信息的对象。

安装程序集时,首先将传入程序集的位与每个已缓存的程序集的位进行比较,并确定程序集是否已安装(如果所有位都相同,则它们显然必须执行相同的操作)。如果已安装程序集,则返回先前缓存的程序集的名称。如果尚未安装,请通过在缓存文件夹中查找程序集名称的可用变体(例如assembly.dll,程序集 - (2).dll,程序集 - (3).dll等)来安装多个版本。 ,将程序集缓存在该文件夹中,并将其缓存的名称返回给调用者。

到目前为止,安全和强有力的命名,在我的应用程序中进行强名称验证是没有意义的,因为它将是Bruce Payette所谓的“草坪侏儒缓解”(攻击者只能走动的安全对策) )。如果攻击者决定毒害一个程序集,他也可以访问存储强名称的位置,并可以轻松地将其更改为他的强名称。最终用户有责任仅从他信任的来源使用程序集。如果用户安装恶意程序集,则是他的错,而不是我的错。尽管如此,为了为用户提供更多保护,默认情况下将禁用在我的应用程序中使用外部程序集。但是,对于其他应用程序,将强名称验证作为额外的安全层实现可能是有意义的。