解決Visual Studio 2010/2012在除錯時lock檔案的方法

千里馬肝發表於2013-09-05

除錯3dsmax外掛,有一個避免每次修改外掛程式碼都需要重啟3dsmax的方法,就是將匯出的核心程式碼寫在一個獨立的DLL中,然後在外掛程式碼需要匯出時LoadLibrary這個DLL,匯出之後再FreeLibrary。這樣的好處是,通過同時開啟2個vs,一個是外掛,另一個是DLL,當需要修改程式碼時,只需要重新編譯DLL即可,除非有致命錯誤導致3dsmax崩潰。

但是從Visual Studio 2010起,VS會一直lock住相關檔案,例如pdb之類的。這樣將導致DLL程式碼在重新編譯時,會出現LNK1201錯誤,從而無法更新DLL的pdb檔案。我花了好幾個小時,終於找到一個解決辦法,為了讓後來者不再浪費時間,下面將說明實現方法。

開啟DLL的工程,在Pre-Build Event中加入以下程式碼:

del "$(OutDir)$(TargetName).pdb.locked.*" /q
if exist "$(OutDir)$(TargetName).pdb" move "$(OutDir)$(TargetName).pdb" "$(OutDir)$(TargetName).pdb.locked.%random%"

先跳過第一句,第二句的意思是,判斷是否存在工程對應的pdf檔案,如果存在,則將其重新命名為"*.locked.隨機數",因為只是move,所以並不影響VS的lock狀態,這時重新生成pdb的操作也將成功。再回頭看第一句,每次編譯前,都將嘗試刪除所有"臨時改名後的檔案",打掃戰場。

因為在外掛執行的時段,DLL會有多次需要修改,所以每次都需要將工程的pdf檔案更名為不同的新名稱,所以通過%random%來確保改名操作成功。

最後,我們又回到了過去那段快樂的時光,有限的生命終於不再因為無數次重啟3dsmax而浪費在無謂的等待中。

 

相關文章