使用全局程序集缓存(GAC) – 以其设计的方式

以下解决方案是否是在代码中使用GAC库的唯一可能性?

Assembly lib = Assembly.Load("MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31f5625abd53197f"); Console.WriteLine(lib.GetType("MyClass").GetMethod("Start").Invoke(obj, null)); 

我有点困惑 – 我已经阅读了很多关于GAC的内容,我知道如何在GAC中签署程序集,安装和卸载程序集,但不知道如何使用它,以及它如何帮助程序员(除了它安全地存储相同库的不同版本)。 我希望我能正常创建类,而不是被迫调用上面提到的方法。

我不想要任何解决方法,例如:“更改Windows注册表”,因为我不认为GAC是为这种操作而设计的。 我想要一个简单的答案:GAC的用途是什么,运行时环境是否以某种方式使用它?

当代码变得非常丑陋且难以管理时,使用GAC的重点是什么? 或许我错过了什么? 也许我应该手动将程序集复制到我的本地文件夹中? 但我听说这也很难。

GAC可以帮助您拥有多个版本的(这是公钥所用的 – 防止名称冲突)并排安装的程序集,并且可供整个机器使用,而不仅仅是您的应用程序目录。

所以,使用版本号从GAC访问程序集几乎就是GAC的设计方式。 😉

顺便说一句:你不应该动态加载东西。

IOW:如果您已经知道类名和汇编版本,那么您可以引用该汇编并跳过相当戏剧性的性能损失,不仅动态加载程序集,还通过reflection调用方法。 (而不是通过接口或代理重用它们)

如果您的程序集已经使用或GAC,那么如果所有内容(哈希等)都匹配,应用程序将自动使用它。

如果在项目中引用程序集,则可以像通常引用的DLL一样使用它,而不是在GAC中。