Forum Programmation.c# GAC: problème avec plusieurs versions d'une assembly

Posté par .
Tags : aucun
0
4
nov.
2005
J'utilise NAnt pour compiler le projet,mais je ne pense pas qu'il soit lié au problème.

Je compile 2 librairies qui utilisent toutes les 2 System.Data et Mono.Data.SqliteClient:


[csc target="library" output="${dir}/Database.dll"]
[sources]
[include name="Libraries/Database/*.cs" /]
[/sources]
[references]
[include asis="true" name="/usr/lib/mono/2.0/System.Data.dll" /]
[include asis="true" name="/usr/lib/mono/2.0/Mono.Data.SqliteClient.dll" /]
[/references]
[/csc]

[csc target="library" output="${tests.dir}/TestDatabaseAccess.dll"]
[sources>
[nclude name="NUnit/Libraries/TestDatabaseAccess.cs" /]
[/sources>
[references]
[include asis="true" name="${tests.dir}/Database.dll" /]
[include asis="true" name="/usr/lib/mono/1.0/log4net.dll" /]
[include asis="true" name="/usr/lib/mono/2.0/System.Data.dll" /]
[include asis="true" name="/usr/lib/mono/2.0/Mono.Data.SqliteClient.dll" /]
[/references]
[/csc]


Database.dll compile correctement, mais pas TestDatabaseAcess.dll.La seule différence que je vois est la librairie /usr/lib/mono/1.0/nunit.framework.dll (1.0, pas2.0). L'erreur est:

[csc] ...NUnit/Libraries/TestDatabaseAccess.cs(98,16): The type IDataReader has two conflicting definitions, one comes from System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 and the other from System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0 89error
[csc] ...NUnit/Libraries/TestDatabaseAcc ess.cs(103,4): error CS0029: Cannot implicitly convert type `System.Data.IDataReader' to `System.Data.IDataReader'
...

Je ne comprends pas pourquoi Mono ne prend pas la version avec laquelle l'assembly a été compilée.

Une idée pour résoudre ce problème?
  • # quelques pistes

    Posté par (page perso) . Évalué à 2.

    Le problème c'est que NUnit dépend explicitement de System.Data.1.0.5. Hors ton programme utilise lui System.Data.2.0. Pour mono ce ne sont pas les même bibliothèque, il y a naturellement un conflit entre les 2.

    Je vois 2 solutions : log4net est peut être enregistré dans le gac 2.0, essai de le référencer directement. Sinon télécharge log4net, et enregistre le dans le GAC 2.0 avec gacutil.
    S'il insiste toujours, tu peux toujours essayer de recompiler log4net en lui explicitant d'utiliser System.Data 2.0.

    Bon courage :)

    Un peu de pub au passage :
    http://monofrance.free.fr
    • [^] # Re: quelques pistes

      Posté par (page perso) . Évalué à 2.

      Remplacer NUnit par log4net bien sûr :)
      En fait log4net est compilée explicitement avec System.Data 1.0.5.
      Ta bibliothèque est compilée explicitement avec System.Data 2.0
      Forcement y'a un conflit :)

      Un truc qui a l'air de marcher, utilise le compilateur gmcs plutôt que mcs. Celui-ci est prévu pour ne marcher qu'avec le profile 2.0, et il fait donc un mapping des versions forcé. Enfin je viens de tester et ca semble marcher.
      • [^] # Re: quelques pistes

        Posté par . Évalué à 1.

        Merci

        J'ai modifier NAnt.exe.config pour utiliser gmcs plutot que msc, et ca marche
      • [^] # Re: quelques pistes

        Posté par . Évalué à 1.

        En fait, la compilation fonctionne,mais pas l'executionde l'assembly:

        ** (/usr/lib/mono/1.0/nunit-console.exe:9255): WARNING **: The following assembly referenced from ...bin/tests/TestDatabaseAccess.dll could not be loaded:
        Assembly: log4net (assemblyref_index=1)
        Version: 1.2.9.0
        Public Key: b32731d11ce58905

        Et pourtant:

        $ gacutil -l|grep log4net
        log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905

        J'utilise lib/mono/2.0/gmcs.exe

        Je vais essayer de recompiler log4net
    • [^] # Re: quelques pistes

      Posté par . Évalué à 1.

      Comment mettre log4net dans le GAC 2.0? Je n'ai pas vu l'option qui permet de hoisir la version. Et je n'ai qu'un fichier gacutil.exe dans /usr/lib/mono/1.0, rien dans 2.0
      • [^] # Re: quelques pistes

        Posté par (page perso) . Évalué à 2.

        En fait y'a qu'un seul GAC, je me suis mal exprimé. Le GAC peut cependant contenir plusieurs versions d'un même assembly. Tu veux pas montrer le code que t'utilises ? Parcque chezmoicamarche comme qui dirait :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.