我有一个.NET程序集(出于无法控制的原因)必须位于GAC中。但是,另一个程序使用相同的程序集,该程序具有相同程序集的较早版本的自己的副本。它必须使用自己的副本,而不要使用GAC中的任何副本。在这种情况下,适当的版本控制可能比它值得的麻烦得多,出于我不愿讨论的原因。我的问题是:是否仍然要告诉.NET:只需在此目录中的此目录中使用THIS DLL,请忽略在GAC或其他任何地方找到的内容。
Answers:
确保GAC程序集和本地程序集具有不同的版本号(至少可以通过在AssemblyInfo中通配您的AssemblyVersion来让您的内部版本号自动递增,这不是一个坏主意:[assembly:AssemblyVersion(“ 1.0.0。*” )])。然后,使用应用程序的配置重定向程序集绑定:
就您而言,您将不需要assemblyBinding配置的“ 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>
*
不会使其自动递增。在MSDN文档AssemblyVersionAttribute表明,它应该是随机的,但在实践中的Visual Studio使用的秒数,因为午夜除以2
如果它们具有相同的版本号,答案是不可以。如果您尝试加载与GAC的程序集具有相同的完整程序集名称(名称,版本,键)的程序集,则CLR每次都会选择GAC的程序集。
绑定重定向不起作用的原因之一是因为Oracle.ManagedDataAccess提供程序对dll的搜索顺序与非托管提供程序不同。非托管提供程序从应用程序目录中启动,然后在注册表中查找dllpath,然后在machine.config中查找dll路径,然后在web.config中查找dll路径。根据Oracle文档,托管提供者的搜索顺序如下:
托管驱动程序将使用以下搜索顺序引用这些程序集:
因此,解决此问题的方法是注销GAC程序集,或者如果无法卸载,则将简单的Oracle.ManagedDataAccess版本与GAC中的版本放到bin和web.config中。