修維 ASP 古蹟遇到問題 - 大清乾隆年間啟用的 OO4O (Oracle Objects for OLE) 在改連 UTF8 編碼的新版 Oracle DB 後中文變亂碼。不想浪費生命在他 X 的 Oracle Client 上,更甭提是 Oracle 11cR2 之後不再支援的 OO4O,我打算寫顆 .NET 元件包 Managed ODP.NET 換掉它。.NET 有 CCW (COM Callable Wrapper) 技術將 .NET 元件包成 COM+ 元件供 ASP、VBScript 呼叫,理論上不是難事。(但實作上仍有一些眉角,這部分以後再聊)

依 CCW 標準做法,要包成 COM+ 的 .NET 元件專案要加數位簽章做成 Strong-Named Assembly、用 Regasm 註冊 COM+ 介面、再用 gacutil 註冊到 GAC。 (註:Regasm 時加 /codebase 參數的話可不註冊 GAC)。我這次踩到的雷出是 gacutil.exe。

Regasm.exe 在 C:\Windows\Microsoft.NET\Framework\v4.0.30919,.NET SDK 幾乎主機都有裝,到處都有。Gacutil.exe 則附在 Microsoft Windows SDK,多半隨 Visual Studio 等開發工具一起安裝(通常是在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin、C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\... 之類的目錄),部署對象不見得有。所以我習慣從開發機器複製 gacutil.exe 及 gacutil.exe.config 到部署包裡,方便直接執行。這招之前用過,本次照舊,不料卻摔了跟斗。

用 reasm /register MyOdpNetCom.dll、gacutil /i MyOdpNetCom.dll 沒有錯誤地完成註冊,跑 VBScript 測試卻怎機都無法建立物件。逼得我反覆檢查 .NET 專案,看看是否漏了什麼細節,查了近半小時才驚覺是 gacutil 搞鬼:

gacutil.exe 根本沒把元件註冊到 GAC,/l 本該顯示 GAC 元件清單卻什麼都沒出現,就連隨便給個不存在的 dll 檔案路徑給它,照樣不吭聲不出錯。

知道問題關鍵所在,用關鍵字爬文很快找到網友分享的茶包文 - Gacutil exits without error, does nothing by Péter Bíró ,指出 gacutil.exe 還需要 1033 目錄下的 gacutlrc.dll 才能正常運作:

補上 gacutlrc.dll 檔案,gacutil.exe 果然回神了:

後來我發現在 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 找到的 3.5.30729.1 版 gacutil.exe 不需要 gacutlrc.dll 就能工作;而這次我是從 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools 複製 gacutil.exe (版號 4.0.30919) 在缺少 gacutlrc.dll 的情況下,無法運作但卻又不報錯,挖了一個坑給我跳。之前我的成功經驗應來自 3.5.* 或更早的版本,而我這回沒看到明確成功訊息,單憑沒錯誤就判定註冊成功才會鬼打牆,也要計入自責分,下回改進。

Case of gacutil's behavior when missing required reference dll.


Comments

# by 失路人

列入非受迫性失誤?

# by Jeffrey

to 失路人,超貼切!但考量看到OO4O情緒失控難免,因此大會判定本案例介於受迫與非受迫之間。

Post a comment