使用 Visual Studio 2019 編譯 Web Site Project 時吐出奇怪錯誤訊息,只有短短一句:Build (web): 並未將物件參考設定為物件的執行個體。(Object reference not set to an instance of an object),錯誤所在的專案、檔案及行號則是一片空白(下圖黃框處)。調整 Visual Studio 的 MSBuild 輸出選項,將 Build and Run / MSBuild project build output verbosity 調成 Diagnotics,依然只有這行錯誤訊息,資訊之少令人傻眼:

爬文查到一些文章提到可能與 RDLC BuilderProivderCrystal Report BuilderProvider 有關,專案並未用報表故可排除;另外找到一篇是 Oracle.DataAccess 版本不符造成,但專案用的 Oracle.DataAccess.dll 取自可正常運作的站台,比對與 web.config 內的參照版號也相符,案情陷入膠著。

放棄直接編譯,嘗試改 Publish 網站,出現較明確錯誤訊息:

真的是 ODP.NET 版本問題 - 經典的 32/64 位元版本不符。用前幾天學到的 PowerShell 檢查 DLL 平台目標確認專案 bin 資料夾下的 Oracle.DataAccess.dll 版號雖然相同卻是 64 位元版本,而該網站是跑 32 位元模式,明顯有誤。問題在換成 32 位元版本後消失。

留下一個謎團:ODP.NET DLL 取自可正常執行的 32 位元模式 IIS 應用程式,怎麼會是 64 位元版本,還搞出這麼詭異的坑?

我很快想到答案: ASP.NET /bin 組件載入跟你想的不一樣

明白這點,趕緊把 IIS bin 下的 Oracle.DataAccess.dll 移除,以免它再繼續害人。

Experience of solving weird "object reference not set to an instance of an object" build error of web site project.


Comments

# by Benny Leung

如果只是想知是32還是64 用notepad看看就知道了 https://superuser.com/questions/358434/how-to-check-if-a-binary-is-32-or-64-bit-on-windows

# by Jeffrey

to Benny Leung, 這招好! 簡單有效。感謝分享。

Post a comment