2010-03-29 5 views
1

D'abord, je vais essayer d'expliquer ce que je veux faire.Configurer NHibernate avec l'assembly de mappage dll dans un autre répertoire que le fichier de configuration

L'application charge un fichier de configuration NhHibernate et analyser le XML, ce qui permet des modifications à la chaîne de connexion et l'ensemble de cartographie. Le problème est que lorsque j'exécute l'application dans le répertoire qui contient NHibernate.dll et toutes les références, cela fonctionne bien, mais si je lance l'application à partir d'un autre répertoire, le Configure() échoue.

C'est le code que j'ai:

 Configuration cfg = new Configuration(); 
     cfg.Properties = props; // the properties are OK 
     cfg.AddAssembly(Assembly.LoadFrom(filename)); // <- this line fails 

Quand je débogués NHibernate, il a échoué dans cette méthode dans la classe NHibernate.Util.ReflectUtil:

public static System.Type TypeFromAssembly(AssemblyQualifiedTypeName name, bool throwOnError) 
. 
. 
Assembly assembly = Assembly.Load(name.Assembly); // line 265 
. 
. 

Cette méthode de recherche pour l'assemblage en le domaine actuel, mais l'assembly est situé dans un autre répertoire.

Le but de l'application est de reproduire dans différents environnements de développement et de test peu de changements apportés aux entités. Je ne veux pas que les autres développeurs copient cette application sur leurs projets, je veux qu'ils choisissent le bon répertoire de projet dans l'application, puis l'application va configurer NHibernate, et si l'utilisateur le demande, il va exécuter les mises à jour de leur DB .

J'ai essayé de chargement/exécution de l'application dans un autre AppDomain mais sans succès.

Peut-être que ce n'est pas possible? ou il me manque quelque chose.
Certains conseiller s'il vous plaît, je suis coincé avec ce problème.

PD: Désolé pour mon anglais, corrigez la question si nécessaire.

Répondre

3

Si les ensembles sont nécessaires dans un répertoire non standard, vous aurez besoin pour aider le CLR les trouver. Il y a plusieurs façons de le faire:

  1. Via un probing element dans la configuration.
  2. Via AppendPrivatePath dans un personnalisé AppDomain. Par l'intermédiaire de l'événement AssemblyResolve de AppDomain
+0

Merci Kent, je résolu mon problème avec la 3ème option, l'autre 2 ne fonctionne pas comme prévu. Voici un autre exemple: http://support.microsoft.com/kb/837908 – emmanuel

Questions connexes