2006-04-12

C++/CLI & COLLADA DOM

好久沒有更新進度了. 最近總算開始有閒暇的時間coding了.

目前正在看COLLADA 1.4的spec.以及DOM的API. 為了測試API, 想說在.NET下使用看看, 於是嘗試使用C++/CLI 2.0寫一個簡單的Form 開OpenFileDialog選檔案透過COLLADA DOM API來載入檔案.

這麼簡單的程式一下子就寫好了, 於是開始build. 但卻是惡夢的開始.

首先遇到的問題是無法link. 大概知道應該是managed code和unmanaged code混用的問題, 於是用google開始找答案.還好這個問題很容易找到答案, 原來在Common Language Runtime support要設為/clr(原本預設為/clr:pure).

果然可以link了. 接下來執行, 發生了更怪的問題, 程式說找不到msvcr80.dll.
於是也請google幫我找答案. 找到一堆與.NET和native DLL相關的文章, 了解到MS為了解決DLL版本的問題, 想了新招式, 但是看了有點眼花撩亂. 因為我並沒有使用自己的DLL. 最後決定所有的library都重新build. 包括COLLADA DOM Library和它有用到的libxml2, iconv. 終於沒有出現那個錯誤訊息了.

以為一切天下太平了, 結果程式卻當在初始COLLADA DOM Library的static 變數. 真是暈倒. 遇到問題還是請萬事通google來找答案, 也找到了答案. 原因是在.NET下要初始化unmanaged code裏的靜態變數會有問題. 只要在程式啟動時呼叫__crt_dll_initialize()就可解決這個問題.(宣告在_vcclrit.h, 程式結束時呼叫 __crt_dll_terminate())

終於, 程式可以動了.

依據MSDN(Initialization of Mixed Assemblies) 說只要library也是用/clr編譯, 就可以不需要呼叫_vcclrit.h定義的function了, 只是用/clr不知道是否會變慢?!

Anyway, 可以繼續測試COLLADA DOM 了. 趕快將程式改成支援1.4的格式.