我有一個使用本機C++和C++/CLI構建的項目。我有以下組成部分:.NET符號從程序集中消失
Assembly A (C++/CLI) | uses Assembly B (C++/CLI) | uses Static Lib C (Native C++)
我做了靜態庫的C的主要重寫,並將其編譯,並使用它的其他本地項目編譯罰款爲好。在重新編寫組件B時沒有發生任何變化 - 並且如我所料,當我編譯程序集B時,它編譯時沒有錯誤或警告。但是,當我嘗試編譯程序集A時,找不到在程序集B中可用的符號,導致出現數百個錯誤。我嘗試在A項目中添加和刪除B和C作爲參考,但沒有運氣。我嘗試做一個乾淨的,從頭開始重建所有東西 - 但仍然沒有運氣。我在RedGate的Reflector中加載了Assembly B,並且我看不到這些符號,所以至少這是一致的。我正在一個分支上工作,所以我從trunk中加載了一個早期版本的Assembly B(它要求卸載我從分支加載的以前版本),並且可以看到它中的所有符號。所以當我看到我目前版本的Reflector中的Assembly B時,我看到:
+TFModelSetNETD, Version=1.0.3532.42171, Culture=neutral, PublicKeyToken=null +TFModelSetNETD.dll + References + {} - + <CppImplementationDetails> + <CrtImplementationDetails> + vc_attributes
就這樣。在舊版本中,我看到了這四個條目,加上我在Assembly B,Static Lib C,其他庫中聲明的所有命名空間,以及幾個boost和std命名空間。我應該提到這是在Visual Studio 2008中。
關於這裏發生了什麼的任何想法?我無法理解我可以做什麼來使編譯器不導出任何符號,也沒有給我任何警告。
想法,提示或調試建議都非常感謝。
編輯:我已將Static Lib C加載到LibDump中,並且所有符號都存在 - 但是,在用Assembly B進行檢查時,組件B中定義的或者從Static Lib C引用的符號都不可見紅門反射器。
A和B是一個dll左右嗎? – Lodle 2009-09-03 06:35:51
有沒有什麼辦法可以檢查程序集B的.vcproj文件的舊版本(從什麼時候開始工作),並將它與最新的.vcproj文件進行比較以得到相同的程序集?這些文件只是在某種程度上是人類可讀的,可能會暗示某些標誌/選項可能會意外地觸發了該項目... – reuben 2009-09-03 06:37:37
Lodle:A和B都是DLL Reuben:好的建議!我試過了,除了頭文件和cpp文件部分的差異之外,唯一的變化是:1)我發現我的proj被設置爲Unicode,而我們擁有的其他所有東西都是MBCS,而且我打開了「ShowIncludes,然後把它關掉,所以在新的proj中有一個ShowIncludes = false。我把字符設置改回了MBCS,清理並構建了,但沒有歡樂。 感謝您的意見! – 2009-09-03 12:06:48