我有一个项目需要使用NHibernate与我的Oracle数据库进行通信。
我工作场所的许多项目都使用NHibernate,因此NHibernate程序集被放置在全局程序集缓存中,这是一个我不太了解的工具。根据我的研究,我收集了以下内容:
第二点显然与其他三个相矛盾,但如果它只是假,我就不会有任何引用库的问题。它肯定反映了现实,因为我的GAC程序集无法在“添加引用”窗口中找到。
我想知道两件事:
答案 0 :(得分:5)
所有引用它的.NET项目现在都将使用新版本。
不,那叫做DLL地狱。应用程序引用程序集的特定版本。您可以更新DLL并更新使用它的应用程序。并且不会破坏使用该DLL的旧应用程序,但不会重新编译。您可以使用GAC执行此操作,因为它可以存储DLL的多个版本。或者,您可以通过将DLL保存在与应用程序的EXE相同的目录中来轻松完成此操作。
GAC中的程序集不会出现在“添加引用”对话框中。必然如此,您不知道您的用户在她的GAC中存储了什么。您可以使用开发计算机上的“浏览”选项卡,这样您就可以确保使用DLL的特定版本。
GAC对需要分发安全更新的公司非常重要。像微软一样。它确保没有浮动的DLL的未修补副本。对于[ComVisible]程序集解决COM的DLL Hell问题也很重要。就是这样。
答案 1 :(得分:3)
在项目中添加GAC参考的“强力”方法是直接编辑项目文件。卸载项目并在与项目中其他引用相同的Reference
元素下添加ItemGroup
,例如:
<Reference Include="System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
</Reference>
您需要注意,“添加引用”对话框的.NET选项卡中的程序集的设计时位置与GAC中程序集的引用的运行时解析之间存在差异。通过.NET选项卡和文件浏览选项卡添加引用之间的区别在于前一种情况下的引用未标记为“复制本地”,因此在运行时将从GAC中查找。 Microsoft通常会在%programfiles%\ Reference Assemblies目录下的文件夹中放置要从GAC引用的程序集的副本,但这些只在设计时使用。
答案 2 :(得分:1)
1 ....你在缓存中一次更新它,所有引用它的.NET项目现在都将使用新版本。
不完全是。您可以控制应用程序是使用新版本还是旧版本。漂亮的东西都可以同时出现在GAC中。
- 我的前任采取了哪些步骤来引用GAC中的库,而不涉及注册表?
只需a)将其注册到GacUtil /i
并b)添加引用,浏览到原始dll位置。 c)验证新的ref具有CopyLocal = false和StrongName = true
答案 3 :(得分:1)
这似乎是我的前任在GAC中添加了对程序集的引用的方式:
但是,看看其他答案,我怀疑这是个好主意。恰好,开发,测试和生产环境的GAC都是相同的。如果GAC未同步,则引用可能不会保持有效。
答案 4 :(得分:0)
回答可能为时已晚,但我找到了一种非常简单的方法(没有黑客攻击)。
希望有所帮助