2014-04-08 14 views
1

是否有可能使用垃圾回收編寫C++/CLI代碼,並將其編譯爲本地機器代碼(提前,而不是JIT)?是否可以使用垃圾回收來創建本機代碼?

+0

你能澄清你在找什麼?在談論C++/CLI時,「本地」的反義詞是「管理」。您是否正在尋找一種將託管C++/CLI直接編譯到x86而不是IL的方法?或者你在尋找一個可以在非託管C++對象上運行的垃圾收集器嗎? –

+0

@David Yaw,C++/CLI允許將源代碼編譯爲本地或MSIL ......我只是不確定是否可以在代碼編譯爲本地時分配和訪問託管CLR對象。 – user626528

+0

「提前」vs JIT的意思是[NGEN](http://msdn.microsoft.com/en-us/library/6t9t5wcf(v = vs.110).aspx),它創建處理器特定的代碼,運行在CLR。 (另外,請參閱[MSDN博客](http://blogs.msdn.com/b/clrcodegeneration/)。)但是我懷疑這不是你在做什麼。 –

回答

2

簡而言之:無(見下文)

在長:

如果使用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

+0

不完全。可以使用gcroot類從本機代碼引用GC對象。 – user626528

+0

如果你的意思是「native」爲「沒有MSIL」,那麼這是錯誤的。您只能在「使用/ clr編譯的非託管類」內使用gcroot!當然,您可以固定一個對象並將固定的句柄傳遞給本機函數。但是一個本地函數無法處理這個數字...... –

+0

這是否意味着「使用/ clr編譯的非託管類」將其所有方法編譯爲MSIL?我找不到反射器的任何方法。 – user626528