是否有可能使用垃圾回收編寫C++/CLI代碼,並將其編譯爲本地機器代碼(提前,而不是JIT)?是否可以使用垃圾回收來創建本機代碼?
回答
簡而言之:無(見下文)
在長:
如果使用C++/CLI您自動使用IL-代碼,它可以與dotPeek或其他工具可以非常容易地反編譯。但你有GC;)
如果你只想讓你的C++/CLI項目的某些部分是本地的,那麼你可以禁用這個文件的「/ clr」選項(或者更好的:只啓用/ clr選擇真正需要.net支持的文件!)。堅果在本地部分你沒有GC(
另外,您還可以標記你的代碼的特殊部位與pragma managed/unmanaged
#pragma managed
#pragma unmanaged
NGEN創建組件的預編譯的形象,但並不能掩蓋.net代碼;所以這只是有用的,如果你的程序集有啓動計時問題,通常只有你有UI應用程序時纔會出現問題,另外一個副作用是ngened的assensly有時比jitted的assembly更慢。使用ngen ...
但是:
但MS現在已經看到這有幾個問題。 MS在這種情況下正在做一些改進。目前僅適用於商店應用程序,但我認爲這也將改進爲適用於「正常」.NET應用程序。 這意味着:你可以寫全GC支持這些應用.NET應用將編譯爲本地代碼,不使用IL數據。只有在特殊情況下需要IL數據(如XmlSerializer)。
欲瞭解更多相關信息,請參閱: Microsoft .NET Native
不完全。可以使用gcroot類從本機代碼引用GC對象。 – user626528
如果你的意思是「native」爲「沒有MSIL」,那麼這是錯誤的。您只能在「使用/ clr編譯的非託管類」內使用gcroot!當然,您可以固定一個對象並將固定的句柄傳遞給本機函數。但是一個本地函數無法處理這個數字...... –
這是否意味着「使用/ clr編譯的非託管類」將其所有方法編譯爲MSIL?我找不到反射器的任何方法。 – user626528
- 1. Android JNI本機代碼中的C++對象是否調用垃圾回收?
- 2. PHP中是否有垃圾回收?
- 3. 結構是否可用於垃圾回收?
- 4. 回收垃圾收集代表
- 5. 通過創建循環鏈表來防止Java垃圾回收?
- 6. java垃圾回收
- 7. Java:垃圾回收
- 8. Python垃圾回收
- 9. C#垃圾回收
- 10. Erlang垃圾回收
- 11. java - 垃圾回收
- 12. JDBC垃圾回收
- 13. JS垃圾回收
- 14. requestAnimationFrame垃圾回收
- 15. vb.net垃圾回收
- 16. ColdFusion垃圾回收
- 17. PhoneGap垃圾回收
- 18. Chrome垃圾回收
- 19. Java:垃圾回收
- 20. Javascript垃圾回收
- 21. Java - 可用的垃圾回收算法
- 22. 從函數創建和返回對象:可以避免垃圾回收嗎?
- 23. context.detach - 用於垃圾回收
- 24. 垃圾收集器如何確定對象是否是垃圾?
- 25. 如何確定我是否需要使用垃圾回收器?
- 26. D編程語言是否使用增量垃圾回收器?
- 27. 是否有不使用代垃圾收集
- 28. 這段代碼可以垃圾收集嗎?
- 29. java.io.serializable是否可以防止垃圾收集?
- 30. 是否可以對System.Diagnostics.Process實例進行垃圾收集?
你能澄清你在找什麼?在談論C++/CLI時,「本地」的反義詞是「管理」。您是否正在尋找一種將託管C++/CLI直接編譯到x86而不是IL的方法?或者你在尋找一個可以在非託管C++對象上運行的垃圾收集器嗎? –
@David Yaw,C++/CLI允許將源代碼編譯爲本地或MSIL ......我只是不確定是否可以在代碼編譯爲本地時分配和訪問託管CLR對象。 – user626528
「提前」vs JIT的意思是[NGEN](http://msdn.microsoft.com/en-us/library/6t9t5wcf(v = vs.110).aspx),它創建處理器特定的代碼,運行在CLR。 (另外,請參閱[MSDN博客](http://blogs.msdn.com/b/clrcodegeneration/)。)但是我懷疑這不是你在做什麼。 –