C# 需要提供nhibernate配置到程序集的路径

C# 需要提供nhibernate配置到程序集的路径,c#,nhibernate,schema,C#,Nhibernate,Schema,我有一个解决方案,它使用NHibernate根据映射文件生成db模式。我正试图将该功能从解决方案中分离出来,以便将其用作独立的控制台应用程序。我能够提供映射文件的路径,如下所示: NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); /**/ Assembly contractsAssembly = Assembly.LoadFrom(@"C:\Data\De

我有一个解决方案,它使用NHibernate根据映射文件生成db模式。我正试图将该功能从解决方案中分离出来,以便将其用作独立的控制台应用程序。我能够提供映射文件的路径,如下所示:

        NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();

        /**/
        Assembly contractsAssembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.Contracts.dll");
        Assembly assembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.dll");
        cfg.AddAssembly(contractsAssembly);
        cfg.AddAssembly(assembly);
        /**/


        DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\Mappings");
        FileInfo[] mappingfiles = directoryInfo.GetFiles("*.hbm.xml");
        foreach (FileInfo fi in mappingfiles)
        {
            cfg.AddFile(fi.FullName);
            //cfg.Configure(myAssembly, fi.FullName);                
            //cfg.AddResource(fi.FullName, myAssembly);
        }
因此,当它尝试添加文件时,会抱怨找不到NHibernateTestMappings.Core程序集,因为在我的独立应用程序中没有对该程序集的引用,但每个映射文件都包含对该程序集的引用:

<class name="NHibernateTestMappings.Core.Store, NHibernateTestMappings.Core" table="STORE" lazy="false">

我需要的是一种向nhibernate配置提供程序集dll的文件路径的方法,而不是添加对它的引用,这样我就可以在app.config中交换路径并让它生成我的架构。

您尝试过这个吗:

var myAssembly = System.Reflection.Assembly.LoadFrom(path);

好的,我现在正在工作,但是我可能已经在nhibernate中发现了一个bug。以下是NHibernate.cfg.Configuration.AddAssembly中的代码:

public Configuration AddAssembly( string assemblyName )
{
      log.Info( "searching for mapped documents in assembly: " + assemblyName );
      Assembly assembly = null;
      try
      {
            assembly = Assembly.Load( assemblyName );
      }
      catch( Exception e )
      {
            log.Error( "Could not configure datastore from assembly", e );
            throw new MappingException( "Could not add assembly named: " + assemblyName, e );
      }
      return this.AddAssembly( assembly );
}

所以Assembly.Load(assemblyName)并不关心我是否足够好去寻找路径,他只是取了这个名称并试图寻找它。由于该dll与应用程序不在同一目录中,因此无法找到它。我目前的解决方案是出去抓取dll并将它们移动到我的应用程序目录,然后在生成模式后删除它们。如果有任何人有任何进一步的建议,我愿意接受。

是的,在发布这篇文章后,我尝试了各种方法,但没有一种有效。我更新了代码以显示最新的格式副本。我还尝试了一些appdomain的东西,但是失败了,因为没有默认的入口点,因为我的核心是dll而不是exe。这就是为什么我建议您使用上面的代码。然后调用:cfg.AddAssembly(muAssembly);使用这个oerload:public-Configuration-AddAssembly(Assembly-Assembly)代替接受字符串的重载,它直接接受一个“Assembly”对象,并决定如何为它获取这个程序集。拥有一个没有入口点的类库组装不应该是一个问题。