Проблема с Nhibernate.Bytecode.Castle в MSBuild (TFS) - PullRequest
4 голосов
/ 13 января 2010

У нас есть тест сопоставления Fluent NHibernate, который проходит на наших локальных компьютерах, но когда мы регистрируемся в TFS, тесты на сервере сборки не выполняются. Мы используем MSTest. Мы получаем ошибку:

NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException: невозможно загрузить тип 'NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle' во время настройки класса фабрики прокси. Возможные причины: - Сборка поставщика NHibernate.Bytecode не была развернута. - TypeName, использованное для инициализации свойства proxyfactory.factory_class в разделе фабрики сеансов, сформировано неверно.

Решение: Убедитесь, что ваша папка развертывания содержит одну из следующих сборок: 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].

Мы проверили папку удаления, и там есть файл NHibernate.Bytecode.Castle.dll. У нас есть dll и ссылки на Castle.Core, Castle.DynamicProxy2, Iesi.Collections, log4net, NHibernate и NHibernate.ByteCode.Castle. Мы запустили тесты через MSBuild с командной строкой в ​​папке drop, и ошибка все еще возникает. Наши беглые отображения выглядят так (NHibernateConfig.MappingConfiguration ()) вызывает фактические отображения, автоматически):

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

Есть идеи, почему это может быть?

Ответы [ 7 ]

11 голосов
/ 18 января 2010

Если я вспоминаю, как работают сборки байт-кода, вы на самом деле не делаете на них полезную ссылку. То есть вы специально не используете один из их классов в своем коде. В результате, «умное» копирование ссылок приводит к тому, что они не извлекаются. (Возможно, я это придумываю, извините).

Чтобы справиться с этим, вы можете: a) сделать соответствующую сборку байт-кода ссылкой на содержимое Copy Always (meh) или b) создать небольшой глупый класс (private static), который ссылается на любой отдельный класс в вашей фактической сборке байт-кода (meh +) 1).

Я уверен, что есть другая альтернатива, касающаяся принудительного выполнения ссылки, но эти два должны быть самыми простыми, 20-секундными решениями.

6 голосов
/ 27 июля 2010

Была такая же проблема, пришлось добавить ссылку в класс, который делал 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();
        }



    }
}
3 голосов
/ 11 января 2013

Несколько полезных советов.

Вы можете поместить атрибут DeploymentItem в свой тестовый класс. Это скопирует необходимые вам DLL. Вы также должны ссылаться на DLL в ссылках проектов.

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

Вы можете найти отсутствующие библиотеки DLL, сравнив папку / [myapp] / bin / debug с папкой / TestResults / [TestRunDate].

Я использую VS 2012. Это для MSTest.

2 голосов
/ 29 августа 2011

От Свободное владение NHibernate вики : Конфигурация 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"))
2 голосов
/ 10 июня 2011

Добавление ссылки на NHibernate.ByteCode.Castle.dll устранило эту проблему для меня.

1 голос
/ 27 июля 2010

На самом деле, метод ReferByteCode необходим, только справка не помогает.Это взлом, достойный МакГайвера, но он работает.

0 голосов
/ 15 января 2013

Ребята, если у вас возникла эта проблема, я предлагаю вам скачать другой пакет Castle. В моем случае проблема заключалась в том, что в загруженном пакете действительно не был реализован интерфейс (IProxyFactory или что-то подобное), поэтому я удалил NHibernate.ByteCode.Castle и NHibernate.ByteCode.Search и установил пакет NHibarnate.Castle, который решает все проблема Я использую NuGet Package Manager!

и помни, что Fusion Log - твой друг!

...