2015-03-19 125 views
11

我目前正在努力解決由Microsoft.SqlServer.Types及其關聯的非託管庫SqlServerSpatial110.dll導致的部署問題 - 這兩個問題都適用於Microsoft SQL Server 2012。這些問題輕而易舉地解決,只是典型的缺少DLL問題,但我試圖決定用完美的方式來處理這些依賴關係。首先,我必須聲明,我不同意手動部署任一庫(通常通過將它們複製到項目的輸出目錄中,或者可怕地將它們複製到System32本身中)是正確的。 Microsoft爲這些文件提供可再發行的MSI安裝程序,這些安裝程序將這些文件放入系統位置。看起來顯而易見的是,他們希望我們依賴於單獨安裝的這些可再發行組件,或者作爲MSI本身內置的久經考驗的依賴性機制的一部分。全局程序集緩存中的Microsoft.SqlServer.Types.dll?

在發佈的時候,這些可再發行組件的最新版本可從以下網址下載:http://www.microsoft.com/en-gb/download/details.aspx?id=43339

SqlServerSpatial110.dll,也不會出現任何問題。 MSI安裝程序(特定於平臺)將文件放入Windows\System32Windows\SysWOW64中,並且一切正常。

託管包裝庫Microsoft.SqlServer.Types.dll更令人困惑。

在我看來,該文件被放入全局程序集緩存 - 運行MSI後,在我的機器上,我可以看到它位於C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll,該文件具有正確的版本和修改日期。

奇怪的是,我無法直接在Visual Studio的參考瀏覽器或Windows資源管理器中看到它 - 只能在Mythicsoft非常老式的文件系統搜索工具中看到它。 爲什麼我看不到它?

由於文件是幾乎在GAC,我猜想,引用它的項目應做它的一個本地副本 - 他們應該依賴於它在那裏,在目標系統上。我測試了這個假設和它的工作:

  1. 手動從它的位置在C:\Windows\assembly\GAC_MSIL
  2. 複製Microsoft.SqlServer.Types.dll添加到副本的引用。
  3. 確保參考具有Copy Local設置爲False
  4. 生成項目,並確保Microsoft.SqlServer.Types.dll肯定是不存在的輸出。
  5. 測試項目... 沒問題!

所以,如果組件可從GAC在運行時被解析爲滿足這種依賴關係,爲什麼沒有在參考瀏覽器添加引用時顯示?爲什麼我必須將其從GAC中複製並引用副本?

在我的印象中,理想的工作流程會是這樣:

  1. 上開發機上安裝可再發行的MSI。
  2. 如果您的產品是通過MSI部署的,或者在使用'xcopy'部署時手動安裝,請確保將可再發行組件安裝在目標機器上,方法是將其列爲MSI依賴項。
  3. 參考Microsoft.SqlServer.Types從GAC使用參考瀏覽器就像任何框架庫一樣。 (Copy Local默認設置爲False)。
  4. 在運行時,Microsoft.SqlServer.Types(平臺不可知)將從GAC中解析出來,非託管庫的相應副本將根據進程體系結構從系統位置加載。
  5. 不用擔心!

顯然,第3步不會發生。我錯過了什麼嗎?也許我誤解了GAC本身 - 這不會是第一次。爲什麼微軟這樣做?我能接近理想的工作流程嗎?

也許有一種完全不同的方式來管理這種依賴關係 - 這是我明顯沒有想到的。如果是這樣,那是什麼?你如何處理它?

+0

管理解決它?我有一個類似的問題,因爲我想使用geojson.net它有一個nuget包與這些dll的 – 2016-04-18 12:45:00

+0

你有沒有解決這個問題?你知道什麼是獲得這種參考的最佳方式嗎? – GuidoG 2016-08-08 07:29:24

+0

不 - 我在一年多的時間裏沒有參與過這個項目,也沒有遇到過需要我在另一個項目上解決這個問題的情況。抱歉。 – Xharlie 2016-08-08 17:20:25

回答

3

如果這是一次單擊部署,然後轉到Project | Properties | Publish選項卡並單擊「Application Files ...」按鈕。然後應選擇相關文件並確保爲「發佈狀態」值選擇了「包含(自動)」。原因是,看起來VS很聰明,可以確定該文件是否是已知可再發行組件的一部分,並且這使您可以選擇在安裝期間依賴外部軟件包作爲依賴項或自行管理文件。如果你依賴於軟件包,那麼最終用戶可以通過添加刪除程序卸載,並且你的應用程序被破壞:/

相關問題