簡體   English   中英

C#到C ++ / CLI轉換的陷阱

[英]Pitfalls of C# to C++/CLI conversion

我被要求將一些C#代碼轉換為C ++ / CLI。 我的一位經理詢問了兩者之間翻譯概念的潛在陷阱。

我很清楚這兩種語言都被編譯成通用接口語言,並在相同的通用語言運行時中運行。 但是,可以保證為.NET Framework 4.5編譯並調用File.Exists(someFile);的一段C#代碼。 將以為.NET Framework 4.5編譯並調用File :: Exists(someFile)的C ++ / CLI代碼完全相同的方式編譯為CIL。

從理論上講,答案是肯定的,因為這似乎是.NET框架的基礎。 但是,有沒有一種方法可以驗證這一點? 是否出於某種技術原因必須/不可能如此?

編寫C ++ / CLI代碼時肯定會有一些陷阱,並且您對C#非常了解,但對C ++ / CLI卻不了解。 我將避免把它變成一個列表問題,並列舉所有這些,只是更常見的錯誤:

  • C ++ / CLI要求您具體說明值類型和引用類型之間的區別的語言語法。 您必須在引用類型引用上使用hat ^。 String^ foo; 但是有時您沒有,則有意忽略了它。 StreamReader file;一樣StreamReader file; 啟用“堆棧語義”,這是C ++ RAII模式的仿真。 換句話說,當超出范圍時,編譯器將自動處理文件變量。 您可以從C# using語句知道這一點。 最大的陷阱是當您不應該使用帽子時,例如int^ x = 42; 編譯器會毫無保留地接受它,但是最終會得到一個裝箱的int,這在運行時效率極低。

  • C ++ / CLI語言和工具集的開發於2005年停止,此后一直處於維護模式。 因此,它沒有獲得C#在那個時間范圍內獲得的好處,Linq當然是最重要的補充。 沒有lambda表達式支持,沒有匿名類型,沒有擴展方法。 您將不會喜歡轉換使用這些語法結構的C#代碼。

  • 只有不斷的原因之一考慮C#轉換為C ++ / CLI,它是采取的與非托管代碼互操作的大力支持優勢。 無需糾結pinvoke。 一個非常常見的錯誤是將所有內容編譯為MSIL,包括本機C ++代碼。 效果很好,C ++ / CLI編譯器能夠將任何C ++編譯為IL,只要它是符合C ++ 03的標准代碼即可。 但是結果是效率低下的 ,它肯定不會在運行時作為托管代碼運行,並且像正常情況一樣抖動,但是沒有本機代碼生成器的好處。 哪個可以更好地優化代碼。

  • 編譯器的輸出是普通的MSIL,與C#生成的完全相同。 加上使用C ++的程序各部分的本地代碼,從而生成混合模式的程序集。 這使程序集依賴於過程的細節。 換句話說,您可能從C#項目中知道的AnyCPU目標不適用。 這是您在EXE項目中需要注意的事項,必須明確了解Platform目標設置。 使用“ x86”是確保您的程序在64位操作系統上運行時仍能正常工作的常用選擇。 如果要在64位OS上將程序作為64位進程運行,則需要創建兩個 C ++ / CLI程序集版本,並使用安裝程序部署正確的程序集。

您不必擔心File :: Exists(somefile)調用,在MSIL中只有一種方法可以調用該方法。 C ++ / CLI編譯器將生成與C#編譯器完全相同的IL。 如果您真的很擔心,那么可以使用ildasm.exe這樣的反編譯器查看IL,從而建立信心。

[C]確保已為.NET Framework 4.5編譯並調用File.Exists(someFile);的一段C#代碼File.Exists(someFile); 將以為.NET Framework 4.5編譯並調用File::Exists(someFile);的C ++ / CLI代碼完全相同的方式編譯為CIL File::Exists(someFile);

不,不能保證。

實際上, 甚至不能保證通過C#編譯器運行兩次相同的源代碼會產生相同的二進制輸出 因此,可以肯定,兩種不同語言的兩種不同編譯器可能會生成不同的代碼。

(請記住, 可能 ,實際上可能經常這樣做 。但是我們在這里談論擔保 。)

我不明白的是為什么這可能很重要。 由於調用了相同的方法,因此代碼將執行相同的操作。 不僅由文檔保證,而且還可以通過反匯編.NET Framework DLL進行自我驗證。

不能保證兩個程序都具有相同的二進制文件。 一旦通過JIT編譯器,就不會有任何反應。 這就是重點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM