如何强制.NET使用GAC中的程序集的本地副本

我有一个.NET程序集(由于我的控制之外的原因) 必须在GAC中。 但是,另一个程序使用相同的程序集,该程序拥有自己的旧版本的相同程序集的副本。 它必须使用自己的副本,而不是GAC中的任何内容。 在这种情况下,正确的版本控制可能比它的价值更麻烦,因为我不会介入。 我的问题是: 有无论如何告诉.NET:只要在这个目录中使用这个DLL,忽略你在GAC或其他任何地方find的东西

确保GAC程序集和本地程序集具有不同的版本号(至less让您的内部版本号通过在AssemblyInfo中对AssemblyVersion进行通配来自动递增:[assembly:AssemblyVersion(“1.0.0。*” )])。 然后,使用您的应用程序的configurationredirect您的程序集绑定:

在你的情况下,你将不需要assemblyBindingconfiguration的“appliesTo”属性。 你只需要像这样的东西:

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/> </dependentAssembly> </assemblyBinding> </runtime> 

如果他们有相同的版本号,答案是你不能。 如果您尝试将具有相同的完整程序集名称(名称,版本,关键字)的程序集加载为GAC程序集,那么CLR将每次都selectGAC程序集。

您可以将DEVPATH设置为强制加载程序集,请参阅链接文本

这不能回答你的问题,因为它只是用于开发使用,即使没有真正推荐,因为它不反映生产的用法。 不过,我想我会分享它,因为很高兴知道。

你有没有尝试过Assembly.LoadFromFile()? 这是一个手动的事情,但应该在你需要的时候把你的程序集加载到内存中。 然后,.NET将使用内存中的一个而不是寻找它。

另一种方法是如果当地议会没有签署,你可以这样区分。

我有一个类似的问题。 我通过使用ildasmilasm来更改目标dll的publicKeyToken生成一个新的dll。 然后我在项目引用中更新它指向新的dll。 我采取的步骤在这里 。

这对我有效。