2010-01-13 56 views
4

我们在本地机器上传递了流利的NHibernate映射测试,但是当我们签入TFS时,测试在构建服务器上失败。我们正在使用MSTest。我们得到的错误是:MSBuild中的Nhibernate.Bytecode.Castle问题(TFS)

NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException:无法在配置代理工厂类期间加载类型'NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle'。 可能的原因有: - 未部署NHibernate.Bytecode提供程序集。 - 用于初始化会话工厂部分的'proxyfactory.factory_class'属性的typeName格式不正确。

解决方案: 确认您的部署文件夹包含以下组件之一: NHibernate.ByteCode.LinFu.dll NHibernate.ByteCode.Castle.dll ---> System.IO.FileNotFoundException:未能加载文件或程序组装'NHibernate.ByteCode.Castle'或它的一个依赖项。系统找不到指定的文件.WRN:将装配绑定日志记录关闭。 要启用程序集绑定失败日志记录,请将注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)设置为1. 注意:与程序集绑定失败日志记录相关的性能受损。 要关闭此功能,请删除注册表值[HKLM \ Software \ Microsoft \ Fusion!EnableLog]。

我们检查了drop文件夹,并且NHibernate.Bytecode.Castle.dll在那里。我们有dll和引用Castle.Core,Castle.DynamicProxy2,Iesi.Collections,log4net,NHibernate和NHibernate.ByteCode.Castle。我们已经通过MSBuild使用drop文件夹中的命令提示符运行测试,并且仍然出现错误。我们流利的映射是这样的(NHibernateConfig.MappingConfiguration())调用实际映射,automapped):

Fluently.Configure() .Database(SQLiteConfiguration.Standard.ShowSql()InMemory()) .Mappings( NHibernateConfig.MappingConfiguration()) .BuildConfiguration();

任何想法,为什么这可能是?

+0

你添加了对NHibernate.ByteCode.LinFu.dll的引用NHibernate.ByteCode.Castle.dll? – Burt 2010-01-13 17:56:52

+0

我们不使用林福。我已经更新了所有参考文章的帖子。 – JontyMC 2010-01-13 18:22:10

回答

11

如果我记得字节码程序集是如何工作的,那么实际上并没有对它们做有用的参考。那就是你没有专门在你的代码中使用他们的一个类。因此,“智能”参考复制会导致这些不被引入。(我可能会做出这件事,对不起)。

要解决这个问题,你可以:a)使适当的字节码组件成为复制总是内容引用(meh)或者b)创建一个愚蠢的小类(私有静态),引用实际字节码组合中的任何一个类(meh +1)。

我确信还有另外一种方法可以强制引用被尊重,但这两个应该是最简单的20秒解决方案。

+0

谢谢,使用静态类工作。这看起来有点像黑客。我尝试使用testrunco​​nfig来拉入dll,但是我无法让它工作。 – JontyMC 2010-01-18 14:42:30

+1

太好了。由于VS用于解析引用的MSBuild任务比团队构建的更复杂,因此出现了混乱。我个人并没有调查过这两者。 – 2010-01-18 15:39:38

+0

设置NHibernate.Bytecode.Castle引用“复制本地”为我解决了它。 – 2012-01-17 13:26:50

6

有同样的问题,不得不在流利的课上加上参考。配置。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using NHibernate; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Automapping; 
using FluentNHibernate.Conventions.Helpers; 
using FluentNHibernate.Conventions; 
using FluentNHibernate.Conventions.AcceptanceCriteria; 
using FluentNHibernate.Conventions.Inspections; 
using FluentNHibernate.Conventions.Instances; 
using FluentNHibernate.MappingModel; 
using FluentNHibernate; 
**using NHibernate.ByteCode.Castle;** 

namespace CESP_NotifyLib 
{ 
    class SessionFactoryController 
    { 

     public SessionFactoryController() 
     { 

     } 

     public ISessionFactory GiveFactory() 
     { 
      return CreateSessionFactory(); 
     } 

     **private static void ReferByteCode(){ 

      //Just to make sure the ByteCodeCastle is loaded 
      ProxyFactory fake = new ProxyFactory(); 
     }** 

     private static ISessionFactory CreateSessionFactory() 
     { 
      ReferByteCode(); 

      var cfg = new NotifyFluentNhibernateConfiguration(); 

      return Fluently.Configure() 
       .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005 
        .ConnectionString("Server=[MYSERVERIPADRESS]\\DBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=[MYPASSWORD];Trusted_Connection=False;") 
      ) 

       .Mappings(m => { 
        m.AutoMappings 
        .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg)); 

       }) 

       .BuildSessionFactory(); 
     } 



    } 
} 
1

实际上,'ReferByteCode'方法是必需的,只有参考没有帮助。它是一个值得McGyver的黑客,但它有效。

2

添加对NHibernate.ByteCode.Castle.dll的引用为我解决了这个问题。

2

Fluent NHibernate wiki: ProxyFactory类配置中缺少

内CreateSessionFactory数据库配置缺少ProxyFactoryFactory调用。由于问题154是wontfix,因此需要将一行

.ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle") 将需要添加到数据库配置调用中。我看起来像这样:

return Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.UsingFile("firstProject.db") 
    .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")) 
4

一些有用的提示。

您可以在您的测试类上放置DeploymentItem属性。这将复制您需要的DLL。您还必须在项目引用中引用该DLL。

[TestClass] 
[DeploymentItem("NHibernate.ByteCode.LinFu.dll")] 
[DeploymentItem("NHibernate.ByteCode.LinFu.xml")] 
public class Accounts 

你可以找到失踪的DLL由/ [MYAPP] /斌/ debug文件夹比较到/ TestResults/[TestRunDate]文件夹中。

我正在使用VS 2012.这是针对MSTest的。

+0

这对我有用。谢谢 :) – 2013-05-16 07:08:54

0

伙计们,如果你有这个问题,我建议你下载其他包的城堡。在我的情况下,问题是在我下载的包中没有实现接口(IProxyFactory或类似的东西),所以我删除了NHibernate.ByteCode.Castle和NHibernate.ByteCode.Search并安装了解决我所有的NHibarnate.Castle包日问题。 我正在使用NuGet包管理器!

并记住融合日志是你的朋友!