เป็นไปได้ไหมที่จะใช้ C ++ กับ. NET Framework


18

ฉันได้อ่านความคิดเห็นมากมายเกี่ยวกับการเขียนโปรแกรม GUI ทั้งใน C # และ C ++ และฉันสังเกตเห็นว่า. NET Framework ของ Microsoft นั้นทรงพลังสำหรับการเขียนโปรแกรม GUI เป็นไปได้ไหมที่จะใช้ C ++ และ. NET Framework

ฉันคิดว่ามันจะเป็นการผสมผสานที่ยอดเยี่ยมเนื่องจาก C ++ เป็นภาษาที่ทรงพลังและ .NET Framework เป็นที่ต้องการสำหรับการเขียนโปรแกรม GUI บน Windows อย่างที่ฉันได้อ่าน เป็นไปได้ที่จะเขียน GUI ใน C # และฟังก์ชั่นใน C ++ หรือไม่?


7
C # เป็นภาษาที่ทรงพลังมาก
Adam Crossland

2
@Ramhound: มันไม่เป็นความจริงเลยที่ C ++ / CLI นั้นทรงพลังเท่ากับ C # รหัส C ++ / CLI ประกอบด้วยการปรับแต่งทั้งหมดจากคอมไพเลอร์ C ++ และสามารถดำเนินการได้เร็วขึ้นและยังคงมีเทคนิค metaprogramming และ preprocessor จำนวนมากที่ไม่ได้อยู่ใน C #
DeadMG

2
นอกจากนี้ไม่ควรมีความท้าทายในการรับ C # หากใช้งาน C ++ ได้ดี ฉันไม่ได้พูด แต่ฉันกำลังพูด
Rig

4
เมื่อทราบว่า C ++ คุณจะมีตัวเลือกระหว่างการเรียนรู้ C ++ / CLI หรือ C # ไม่ใช่ C ++ ที่แท้จริง ฉันขอแนะนำให้เรียนรู้ C # แทนที่จะพยายามทำงานกับ C ++ / CLI C ++ / CLI ไม่ใช่ภาษาท้องถิ่นดังนั้นคุณจะพบหนังสือและการสนับสนุนมากมายสำหรับ C #
David Thornley

6
@ddacot ไม่, C ++ ไม่ได้มีไว้สำหรับการพัฒนาเกมเลย มันมีไว้สำหรับการพัฒนาซอฟต์แวร์เช่นเดียวกับภาษาโปรแกรมอื่น ๆ ทั้งหมด เกมเกิดขึ้นเป็นซอฟต์แวร์ประเภทหนึ่ง
MattDavey

คำตอบ:


21

ใช่มันเป็นที่รู้จักกันในชื่อManaged C ++และตอนนี้C ++ / CLI คุณสามารถเข้าถึง. NET Framework ทั้งหมด (GUI: WinForms, GDI +, ฯลฯ ) ตามที่คุณต้องการจากภาษาที่ได้รับการจัดการอีกสามภาษา ได้แก่ C #, F # และ VB.NET


+1 กับคำตอบของเจส หากฉันไม่เข้าใจผิด C ++ / CLI ไม่รองรับการสืบทอดหลายแบบ ดังนั้นเตรียมคุณสมบัติบางอย่างที่ไม่คาดคิด คุณลักษณะบางอย่างมาจากข้อ จำกัด ของ CLI ฉันขอแนะนำให้คุณพยายามค้นหาความแตกต่างระหว่าง C ++ / CLI และ 'classic' C ++ ก่อนที่คุณจะเริ่มใช้งาน
Igor Soloydenko

นี่คือรายละเอียดที่กล่าวถึงในลิงค์แรก สรุปจึง: "C ++ มีการพัฒนาอยู่ตลอดเวลาและซอฟต์แวร์ส่วนใหญ่ที่เขียนในภาษานั้นเป็นเชิงวัตถุ Managed C ++ และการใช้คลาสและวัตถุตามคลาสยังคงแพร่หลายเช่นใน Visual C ++ การเปลี่ยนแปลงที่สำคัญเพียงอย่างนี้ใน Managed C ++ คือความสามารถของการสืบทอดหลายอย่างไม่ได้รับการสนับสนุนนี่เป็นเพราะข้อ จำกัด ของ CLR คลาสที่จัดการภายใต้ตัวรวบรวมขยะของ CLR ไม่สามารถรับมรดกได้มากกว่าหนึ่งคลาส "
Jesse C. Slicer

ไม่เป็นไร. จริงๆแล้วฉันไม่เก่งในภาษา C ++ ฉันแค่คิดว่าอาจมีความแตกต่างที่สำคัญอีกอย่างหนึ่งซึ่งอาจทำให้เกิดปัญหาได้
Igor Soloydenko

ครั้งสุดท้ายที่ผมเขียน c ++ บางอย่างแท้จริงในช่วงศตวรรษที่ผ่านมา :)
เจสซีเครื่องตัด

1
@keykeeper การใช้งานทั่วไปของ C ++ / CLI คือการเป็นสะพานเชื่อมระหว่างห้องสมุด C ++ ที่ไม่มีการจัดการกับโลกที่ได้รับการจัดการ มันเพียงพอสำหรับการใช้งานดังกล่าว แน่นอนว่ามันไม่สมเหตุสมผลที่จะเขียนโค้ดบางอย่างที่ใหญ่มากในนั้น
SK-logic

6

อย่าลืมตัวเลือกที่ยืดหยุ่นและเรียบง่ายที่สุดซึ่งเป็นเรื่องปกติสำหรับโลก Unix แต่ด้วยเหตุผลบางอย่างไม่ใช่เรื่องธรรมดาใน Windows: แบ่ง GUI และตรรกะออกเป็นกระบวนการต่าง ๆ สื่อสารผ่าน RPC ในรูปแบบที่สมเหตุสมผล (เช่นแม้แต่ท่อควร งาน). ควรใช้โปรโตคอลข้อความที่อ่านง่ายและใช้งานง่าย

วิธีนี้คุณสามารถใช้ GUI (หรือ GUIs ต่าง ๆ ) ของคุณได้ด้วยเทคโนโลยีใด ๆ ที่คุณต้องการและสร้างส่วนประกอบตรรกะจากสิ่งที่เหมาะสมกับความต้องการที่ดีกว่านั่นคือ C ++ สคริปต์หรืออะไรก็ตาม

ฉันไม่ได้ตระหนักถึงความใด ๆข้อได้เปรียบที่เหมาะสมของแนวทางการออกแบบเสาหินจากโลกของ Windows


4

ฉันทำสิ่งนี้เมื่อไม่กี่ปีที่ผ่านมาย้อนกลับไปในยุคของการจัดการ C ++ เรามีตรรกะทางธุรกิจบางอย่างใน DLL umanaged ที่เราต้องการรวมไว้ใน GUI แบบพ่อมดที่เขียนใน C # เมื่อต้องการทำสิ่งนี้ฉันได้สร้างแอสเซมบลีที่ได้รับการจัดการ C ++ เพื่อนั่งระหว่างแอป GUI ที่ได้รับการจัดการและ DLL ที่ไม่มีการจัดการและใช้ System :: Runtime :: InteropServices :: Marshal ภายในแอสเซมบลีนั้น ประเภท (int) และในทางกลับกัน

ในขณะที่การจัดการ C ++ ดูเหมือนจะถูกคัดค้านหลักการเดียวกันอาจนำไปใช้กับ C ++ / CLI


3

ไม่ได้จริงๆ มีภาษาไฮบริด C ++ / CLI แต่มันก็ดีสำหรับการทำงานร่วมกัน (นโยบายอย่างเป็นทางการของ Microsoft) เนื่องจากวิธีการออกแบบ. NET framework จึงมีความหมายหลายภาษาที่ไม่เหมาะกับการใช้งานบน CLR และ C ++ แสดงสิ่งเหล่านี้จำนวนมาก


7
ฉันไม่เห็นด้วยกับคำสั่งนี้ C ++ / CLI เหมาะอย่างยิ่งสำหรับการใช้งานหลายอย่าง
Ramhound

3
@Ramhound: Microsoft แนะนำตัวเองเท่านั้นสำหรับการทำงานร่วมกัน นั่นเป็นนโยบายอย่างเป็นทางการของพวกเขา
DeadMG

2
@DeadMG คุณสามารถระบุแหล่งที่มาสำหรับสิ่งนั้นได้หรือไม่
sq33G

1
@DeadMG คุณผิด มีตัวเลือกมากมายในการเรียกใช้. NET GUI ด้วยตรรกะดั้งเดิม
SK-logic

2
@DeadMG - เว้นแต่คุณจะแสดงหลักฐานว่านั่นเป็นนโยบายอย่างเป็นทางการของ Microsoft (ฉันไม่เชื่อว่าสักครู่) จากนั้นคุณเพิ่งผ่านรอบ FUD
Ramhound

3

มุม C ++ / CLI ได้รับการครอบคลุมด้วยคำตอบมากมายจนถึงขณะนี้อีกวิธีหนึ่งในการทำเช่นนี้คือการใช้ PInvoke สิ่งนี้ทำให้โปรแกรม C # สามารถเรียกใช้ฟังก์ชันที่มีอยู่ใน DLLs ที่เขียนด้วย C ++ ข้อดีของ PInvoke คือ dll ของคุณไม่เชื่อเรื่องพระเจ้าโดยสิ้นเชิงเกี่ยวกับข้อเท็จจริงที่ว่ามันจะถูกเรียกจาก. Net ซึ่งหมายความว่าคุณสามารถเรียก dll ที่คุณไม่มีซอร์สโค้ดได้และแม้ว่าคุณจะได้ซอร์สโค้ดคุณก็ไม่จำเป็นต้องคอมไพล์ใหม่โดยใช้ตัวเลือก / clr ซึ่งหมายความว่าคุณสามารถใช้ dll นี้กับโปรแกรม C ++ อื่น ๆ เช่นเดียวกับโปรแกรม C # มีบางไลบรารี C / C ++ ที่ยอดเยี่ยมอยู่ที่นั่น: PInvoke ช่วยให้คุณสามารถใช้ประโยชน์จากสิ่งเหล่านี้ได้ บางครั้งไลบรารี Win32 มีฟังก์ชันที่ไม่พร้อมใช้งานใน. Net: PInvoke ช่วยให้คุณสามารถใช้งานได้

หนึ่งในส่วนที่ยากที่สุดในการใช้ PInvoke คือการรู้วิธีแปลงลายเซ็นที่ไม่มีการจัดการเป็นลายเซ็นที่ได้รับการจัดการ แต่มีcheatsheetช่วยด้วย


แต่เมื่อ P / เรียกใช้ C ++ โดยตรงให้ระวังการพันกันหรือดีกว่าให้ห่อหุ้ม C บาง ๆ ระหว่างนั้น
SK-logic

0

นอกจากนี้คุณยังสามารถทำงานกับ C # dill ผ่าน COM (Model Object Component) สำหรับฉัน COM นั้นดีกว่าแล้วใช้ Managed C ++ เนื่องจาก Visual Studio 2010 ไม่มี Intellisense สำหรับ Managed C ++ ในกรณีของฉันเรามีแอปพลิเคชั่น C ++ ขนาดใหญ่อยู่แล้ว แต่ต้องการลองย้ายออกจาก MFC ไปยัง WinForms หรือ WPF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.