2012-01-13 29 views
3

我已經爲某個庫創建了一個C++/CLI包裝器。當我在一個可用的反編譯器中檢查編譯好的程序集時,除了純粹的託管類和名稱空間外,我還看到了大量的非託管純C++類和名稱空間。我沒有意見讓他們在那裏。從C++/CLI程序集元信息中刪除非託管符號

有沒有辦法擺脫他們,只顯示純託管的東西?這是純粹美學的問題,僅此而已。

回答

2

我想你會想創建一個非混合程序集,然後。閱讀上the different 'flavours' of C++/CLR libraries

  • 混合(/ CLR)
  • 純(/ CLR:純)
  • 安全(/ CLR:安全)

特別,你似乎是後/clr:safe這是限制性最強的輸出格式和結果集,就像用eg創建的那樣C#或VB.Net

Mixed, Pure, and Verifiable Feature Comparison

+0

謝謝!當我嘗試使用'/ clr:safe'時,我得到了一堆警告,比如'error C4956:'va_list *':這種類型不可驗證,當我使用'/ clr:pure'時,我得到了很多錯誤C3862 :'':無法使用/ clr:pure或/ clr:safe'編譯非託管函數。 AFAIK,因爲我正在做一個包裝器,所以我必須使用'/ clr',但是我得到一堆不需要的符號。 – wpfwannabe 2012-01-13 15:16:29

+0

@wpfwannabe:你可能會考慮有一個額外的彙編層:有一個'/ clr:safe'外觀,委託給混合模式的'/ clr'程序集來實現實際的包裝器 – sehe 2012-01-13 15:18:32

+0

我明白了。謝謝!這有點麻煩,另一個會議仍然會遭受同樣的疾病,但它比我想象的要好。我希望有一個更直接的解決方案,比如編譯器選項,不過謝謝。 – wpfwannabe 2012-01-13 15:26:28

4

這不僅僅是美學多了很多,你顯然編譯本地代碼,而不是IL機器代碼。 C++/CLI編譯器非常擅長將本地C++代碼編譯爲IL,幾乎支持任何東西。然而你得到的卻是效率低下的,你沒有得到代碼優化器的好處,它可以在編譯器中花費其快樂時間來生成優化的機器代碼。 .NET即時編譯器也有一個優化器,但它不能完成相同的工作。

通過僅將/ clr選項應用於各個源代碼文件來解決此問題。或者,您可以使用#pragma託管指令在源代碼中執行此操作。

+0

我記得前段時間使用過#pragma。謝謝你提醒我。我已經運行了一些測試,並且不管我在哪個地方噴灑'#pragma unmanaged',純粹的C++類仍然顯示在反編譯器中。這是怎麼回事? – wpfwannabe 2012-01-16 14:15:19

相關問題