Programmation.c# : GAC: problème avec plusieurs versions d'une assembly
Posté par jusob () le 04 novembre 2005
0
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?
> Lire le message (6 commentaires, moyenne: 1,5).
Vous avez demandé le commentaire #644857.



quelques pistes
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
MonoFrance
[ Répondre ]
[^]Re: quelques pistes
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.
MonoFrance
[ Répondre ]
[^]Re: quelques pistes
Merci
J'ai modifier NAnt.exe.config pour utiliser gmcs plutot que msc, et ca marche
[ Répondre ]
[^]Re: quelques pistes
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
[ Répondre ]
[^]Re: quelques pistes
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
[ Répondre ]
[^]Re: quelques pistes
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 :-)
MonoFrance
[ Répondre ]