2010-01-13 57 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包管理器!

並記住融合日誌是你的朋友!