C# 需要提供nhibernate配置到程序集的路径
我有一个解决方案,它使用NHibernate根据映射文件生成db模式。我正试图将该功能从解决方案中分离出来,以便将其用作独立的控制台应用程序。我能够提供映射文件的路径,如下所示: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.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”对象,并决定如何为它获取这个程序集。拥有一个没有入口点的类库组装不应该是一个问题。