2009-06-01 12 views
10

Je travaille sur un système pour utiliser un SqlServerCe avec NHibernate. À partir de mon programme de pilote, si j'ajoute l'assembly System.Data.SqlServerCe comme référence, je peux créer et exécuter correctement des requêtes sur une base de données. Lorsque vous essayez d'utiliser NHibernate, cependant, je reçois l'exception suivante:Impossible de charger le fichier ou l'assemblage

Une exception de première chance de type « System.IO.FileNotFoundException » est produite dans mscorlib.dll Informations complémentaires: Impossible de charger « système de fichiers ou d'assemblage. Data.SqlServerCe 'ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.

J'ai tracé l'exception à un appel à Assembly.Load ("System.Data.SqlServerCe"), qui semble fonctionner correctement. L'assembly System.Data.SqlServerCe est dans le GAC (j'ai également essayé de l'ajouter en tant que référence locale avec CopyLocal = true, en vain), et je peux très bien utiliser ses membres, alors pourquoi ne puis-je pas charger explicitement il? Lorsque j'ouvre l'assembly dans Reflector, il a du mal à charger la référence System.Transactions (j'ai également essayé de l'ajouter en tant que référence locale, encore une fois sans succès), donc le chargement de cet assembly pourrait être le problème plutôt que le système. Data.SqlServerCe assembly.

Est-ce un problème courant? Mauvaise configuration du système, peut-être?

+0

On dirait que vous n'avez jamais entendu parler de Fusion: http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx – zvolkov

+0

Ooh, outil soigné. Les commentaires qu'il me donne est: LOG: La même liaison a été vu auparavant, et a échoué avec hr = 0x80070002. ERR: Une erreur irrécupérable s'est produite lors du contrôle de pré-téléchargement (hr = 0x80070002). Ce qui ne semble pas très utile - c'est déjà tombé en panne, alors échouons à nouveau? J'ai besoin de lire sur les documents de fusion pour espérer trouver cela un peu mieux. Cependant, on m'a montré une solution à mon problème - détails ci-dessous. – Dathan

Répondre

8

Apparemment, ceci peut être résolu en ajoutant un élément <qualifiedAssembly> au fichier app.config. Ajout de ce qui suit a mon application en cours d'exécution en douceur:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <qualifyAssembly partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> 
    </assemblyBinding> 
</runtime> 

Merci!

+0

Oui, le nom complet mentionné ci-dessus est en effet le nom complet de l'assemblage. Il donne au CLR les informations dont il a besoin pour trouver et charger l'assemblage spécifique. Vous pouvez également remplacer fullName dans une chaîne de connexion dans un fichier .config (à la place du partialName) – nocache

1

J'ai eu un problème similaire. L'erreur que je faisais était que j'essayais d'exécuter le fichier .exe présent dans le fichier ../obj/x86/Release, alors que je suis supposé exécuter le fichier .exe présent dans ../bin/Release. (Je suis un novice absolu à C#).

(J'ai aussi remarqué que dans ce répertoire ../bin/Release, le fichier .dll référencé est copié localement.)

2

Ceci est le plus probablement connecté à un système de configuration (més). Cependant, de par sa conception, SQL Server CE n'est qu'une simple DLL, qui peut être livrée avec votre produit.
Cela signifie que vous pouvez simplement définir Copy local à True dans les propriétés de référence de System.Data.SqlServerCe, et vous avez terminé.

+0

Cela a fonctionné parfaitement pour moi! Merci. –

Questions connexes