2010-03-29 53 views
1

首先我会尝试解释我想要做什么。配置NHibernate与映射程序集dll在其他目录比配置文件

该应用程序加载一个NhHibernate配置文件并解析xml,允许更改连接字符串和映射程序集。

问题是,当我在包含NHibernate.dll和所有引用的目录中运行应用程序时,它运行良好,但如果我从其他目录运行应用程序,则Configure()失败。

这是我的代码:

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

当我调试NHibernate的,它没有在这个方法中类NHibernate.Util.ReflectUtil:

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

,对于组装的方法搜索当前域,但程序集位于其他目录中。

该应用程序的目的是在不同的开发和测试环境中复制对实体所做的小改动。我不希望其他开发者将这个应用程序复制到他们的项目中,我希望他们在应用程序中选择正确的项目目录,然后应用程序将配置NHibernate,并且如果用户请求,它会执​​行更新到他们的数据库。

我尝试在不同的AppDomain中加载/执行应用程序,但没有成功。

也许这是不可能的?或者我错过了一些东西。
有人建议,我坚持这个问题。

PD:对不起我的英文,如有必要请更正问题。

回答

3

如果所需的程序集位于非标准目录中,则需要帮助CLR找到它们。有许多方法可以做到这一点:

  1. 通过配置中的probing element
  2. 在自定义AppDomain中通过AppendPrivatePath
  3. 通过任何AppDomainAssemblyResolve事件。
+0

谢谢肯特,我解决了我的问题与第三个选项,其他2没有按预期工作。这里是另一个例子: http://support.microsoft.com/kb/837908 – emmanuel 2010-03-30 12:31:23