Oracle Data Provider for .NET : Passer de la version 9i à la 10g

La version 9i de l'ODP for .Net installe la DLL Oracle.DataAccess.dll en version 9.2.0.700 dans le GAC.

La version 10g de l'ODP permet d'installer (en fonction des options sélectionnées à l'installation) deux nouvelles versions de l'assembly Oracle.DataAccess.dll dans le GAC :

Mises en garde

Passer de la version 9.2.0.700 à la version 1.102.2.20

Les deux versions de l'assembly Oracle.DataAccess.dll étant dans le GAC, comment passer d'une version à une autre sans tout recompiler ?
En fait, vous n'avez rien a faire! Enfin, il faut quand même installer ODP for .Net 10g en spécifiant bien que vous voulez installer l'assembly pour le runtime 1x. Mais c'est tout!

En effet les assembly compilés pour utiliser Oracle.DataAccess.dll en version 9.2.0.700 utiliseront automatiquement la version 1.102.2.20 (même si la version 9i est encore dans le GAC).

Petit exemple sur une machine possédant la version 9i et la version 10g de l'ODP for .Net. Oracle.DataAccess.dll - fenêtre de propriété
    static void Main(string[] args)
    {
        Assembly myDll 
           = Assembly.GetAssembly(typeof(Oracle.DataAccess.Client.OracleDbType));
        Console.WriteLine(myDll.FullName);
        Console.WriteLine(myDll.Location);
    }
  

On obtient le résultat suivant :
Résultat

Comment ça fonctionne ?

Pas besoin de fouiller tout le fichier machine.config pour trouver un "bindingRedirect" concernant Oracle.DataAccess.dll... il n'y en a pas.
Il faut donc chercher ailleurs...

En regardant les logs du Binder d'assembly au moment du chargement de la DLL Oracle.DataAccess.dll, voici le résultat que l'on obtient :
*** Entrée du journal Binder d'assembly  (08/08/2011 @ 17:47:14) ***

L'opération a réussi.
Résultat de liaison : hr = 0x0. Opération réussie.

Gestionnaire des assemblys chargé à partir de :  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Exécution sous l'exécutable  D:\Projets\Tests\MyDllUse\MyDllUse\bin\Release\MyDllUse.exe
--- Un journal des erreurs détaillé suit. 

=== Informations d'état de liaison préalable ===
JRN : utilisateur = EMEA\extguean
JRN : DisplayName = Oracle.DataAccess, Version=9.2.0.700, Culture=neutral, PublicKeyToken=89b483f429c47342
 (Fully-specified)
JRN : Appbase = file:///D:/Projets/Tests/MyDllUse/MyDllUse/bin/Release/
JRN : PrivatePath initial = NULL
JRN : base dynamique = NULL
JRN : base de cache = NULL
JRN : AppName = MyDllUse.exe
Assembly appelant : MyDllUse, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
JRN : cette liaison démarre dans le contexte de chargement de default.
JRN : aucun fichier de configuration de l'application n'a été trouvé.
JRN : utilisation du fichier de configuration de l'ordinateur à partir de
      C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
JRN : le fichier de stratégie d'éditeur a été trouvé à
      C:\WINDOWS\assembly\GAC\Policy.9.2.Oracle.DataAccess\1.102.2.20__89b483f429c47342\Policy.9.2.Oracle.DataAccess.config.
JRN : la redirection du fichier de stratégie d'éditeur a été trouvée : 9.2.0.700 redirigé vers 1.102.2.20.
JRN : ProcessorArchitecture est verrouillé à Legacy.
JRN : référence post-stratégie : Oracle.DataAccess, Version=1.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342
JRN : un assembly a été trouvé en recherchant dans le GAC.
JRN : la liaison a réussi. Elle retourne un assembly à partir de
      C:\WINDOWS\assembly\GAC\Oracle.DataAccess\1.102.2.20__89b483f429c47342\Oracle.DataAccess.dll.
JRN : l'assembly est chargé dans le contexte de chargement default.

Avec le "DisplayName", on peut voir que la version demandée est bien la version 9.2.0.700.

Mais on aperçoit une autre ligne intéressante : "la redirection du fichier de stratégie d'éditeur a été trouvée".
En effet Oracle utilise une stratégie d'éditeur aussi appelé "Publisher Policy" qui redirige tous les appels de la DLL 9.2.0.700 vers sa version 1.102.2.20.

Si on jette un coup d'oeil au GAC on trouve le dossier contenant cette stratégie :
Screenshoot du GAC

En ouvrant le dossier on trouve un fichier de configuration qui nous confirme la redirection :
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/>
            <bindingRedirect oldVersion="9.2.0.000-9.2.0.999" newVersion="1.102.2.20"/>
        </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Si vous avez des remarques ou des commentaires, n'hésitez pas à me contacter sur sylvain114.free.fr.