Dot-Net

.NET 參考“複製本地”真/假根據 GAC 的內容設置

  • March 20, 2010

我們在 Win Forms 項目中遇到了一個非常有趣的問題。已經解決了。我們知道發生了什麼,但我們想了解它發生的原因。這可能會幫助將來遇到類似問題的其他人。

WinForms 項目在我們客戶的兩台 PC 上失敗。該錯誤是一個不起眼的 kernel.dll 錯誤。該項目在其他 3 台 PC 上執行良好。

我們發現我們的發布文件夾中缺少一個 .DLL(log4net.dll - 一個非常流行的開源日誌庫)。它以前在我們的發布文件夾中。為什麼在這個最新版本中缺少它?

它失去了,因為我必須在我的開發盒上安裝了一個使用 log4net.dll 的程序,並將它添加到全域程序集記憶體中。

當我檢查解決方案對 log4net.dll 的引用時,它們被更改為“copy local=FALSE”。它們一定是自動更改的,因為我的 GAC 中存在 log4net.dll。

這是我的問題開始的地方:

為什麼我對 log4net.dll 的引用從 COPY LOCAL = TRUE 更改為 COPY LOCAL = FALSE?我懷疑這是因為它是由另一個程序添加到我的 GAC 中的。

我們怎樣才能防止這種情況再次發生?就目前而言,如果我安裝了一個使用通用庫的軟體並將其添加到我的 GAC 中,那麼引用該 DLL 的 SLN 將從 Copy Local TRUE 更改為 FALSE。

發生這種情況是因為如果在 GAC 中安裝程序集,則 Copy Local = True 沒有任何意義。因為永遠不會使用該本地副本,所以始終首先搜尋 GAC。保持不變會導致嚴重的混亂,您會認為您正在使用本地副本,而是獲得另一個副本。更改它也會導致混淆,如果您沒有註意到它,可能已經在解決方案載入時使用消息框解決了這個問題。

Log4net 是個麻煩製造者,在野外有太多的版本沒有任何部署程序來確保這些版本不會互相咬。Apache 顯然不想解決的問題,而是由程序員決定。擁有依賴於 Log4net 並對感知到的 DLL Hell 風險採取措施的產品在某種程度上是不可避免的。給你一個 DLL Hell 問題作為回報。

除了知道您的機器上安裝了什麼之外,沒有簡單的答案。當 Visual Studio 自動更新 Copy Local 屬性時,請考慮發佈到 connect.microsoft.com 以請求警告。這是一個合理的要求。

引用自:https://stackoverflow.com/questions/2481426