MSBuild(TFS)中的Nhibernate.Bytecode.Castle问题

时间:2010-01-13 17:52:17

标签: .net tfs msbuild fluent-nhibernate integration-testing

我们有一个Fluent NHibernate映射测试,它在我们的本地机器上传递,但是当我们检入TFS时,测试在构建服务器上失败了。我们正在使用MSTest。我们得到的错误是:

NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException:无法在配置代理工厂类时加载类型'NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle'。 可能的原因是: - 未部署NHibernate.Bytecode提供程序程序集。 - 用于初始化session-factory部分的'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就在那里。我们有对Castle.Core,Castle.DynamicProxy2,Iesi.Collections,log4net,NHibernate和NHibernate.ByteCode.Castle的dll和引用。我们已经使用drop文件夹中的命令提示符通过MSBuild运行测试,但仍然会出现错误。我们的流畅映射看起来像这样(NHibernateConfig.MappingConfiguration())调用实际的映射,自动化):

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

为什么会出现这种情况?

7 个答案:

答案 0 :(得分:11)

如果我记得字节码组件是如何工作的,那么实际上并没有对它们进行有用的引用。也就是说,您没有在代码中专门使用其中一个类。结果,“智能”参考复制导致这些不被引入。(我可能会这样做,对不起)。

为了解决这个问题,你可以:a)使相应的字节码组件成为一个复制始终内容引用(meh)或b)创建一个愚蠢的小类(私有静态),引用实际字节码组件中的任何单个类(meh + 1)。

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

答案 1 :(得分:6)

有同样的问题,必须在执行Fluently.Configure的类中添加引用。

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();
        }



    }
}

答案 2 :(得分:3)

一些有用的提示。

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

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

通过将/ [myapp] / bin / debug文件夹与/ TestResults / [TestRunDate]文件夹进行比较,可以找到丢失的DLL。

我正在使用VS 2012.这适用于MSTest。

答案 3 :(得分:2)

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

答案 4 :(得分: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"))

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

并记住Fusion Log就是你的朋友!