2012-02-14 92 views
1

在我的web和worker角色中,我引用了核心框架DLL的替代版本。該文件標記爲Copy Local。 Visual Studio在項目引用中顯示正確的版本。編譯項目時,bin目錄也包含正確的版本。Azure包中包含不正確的DLL

但是,當我要求Visual Studio創建一個Azure包時,該包(以及包裝期間創建的csx文件夾)僅包含用於Worker角色的錯誤(原始)DLL。 Web角色具有正確的DLL。如果我手動使用cspack,則不會發生這種情況,但這不是一個真正想要打包的方法。

什麼會導致Visual Studio使用正確的引用DLL進行編譯,但綁定了錯誤的引用?

附加信息: 當我運行msbuild做包裝,而不是Visual Studio中,我看到了下面兩行:

Copying file from "C:\Users\bytenik\Dropbox\Treadmarks\lib\EntityFramework\System.Data.Entity.dll" to "C:\Users\bytenik\Dropbox\Treadmarks\src\Azure\obj\Debug\Worker\System.Data.Entity.dll". 
Copying file from "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.Entity.dll" to "C:\Users\bytenik\Dropbox\Treadmarks\src\Azure\obj\Debug\Worker\System.Data.Entity.dll". 

因此,它似乎複製我的參考,然後在它複製與系統參考。

注意:我很清楚替換.NET CLR DLL的整個概念是一個巨大的破解。當.NET 4.5出來支持我需要的功能時,這一切都將被剝離。同時,我需要能夠繼續發展。

這是對問題「Azure References Incorrect DLL」的替換,它實際上是不正確的,並導致有效的答案,但沒有解決我的問題。

+0

以供將來參考它會更好重新寫了原來的問題。謝謝。 – Kev 2012-02-14 15:51:22

+0

@Kev我想過,但所有的答案都沒有意義。 – 2012-02-14 15:53:43

回答

1

即使Visual Studio項目對GAC中的程序集的本地和/或修改副本有引用,它也將在編譯期間使用,但在運行時,CLR將始終加載程序集來自GAC,即使它坐在與您的應用程序相同的目錄中。

因此,該解決方案不涉及找出一個聰明的方式來打包或部署修改後的程序集,但要弄清楚如何使CLR實際加載它的方法。

兩個可能的解決方案:

1)使用角色啓動任務和安裝工程來部署大會在生產服務器上的GAC修改後的版本。

2)刪除程序集的簽名並確保所有引用都是在沒有簽名的情況下對此版本進行的。注意其他可能引用原始簽名版本的程序集,並嘗試從GAC加載它。

有關詳細信息和鏈接查看How to prevent a .NET application to use an assembly from the GAC?