Có thể sử dụng C ++ với .NET framework không?


18

Tôi đã đọc nhiều bình luận về lập trình GUI, trong cả hai, C # và C ++. Và tôi nhận thấy rằng .NET .NET của Microsoft rất mạnh cho lập trình GUI. Vì vậy, có thể sử dụng C ++ và .NET framework không?

Tôi nghĩ nó sẽ là một sự kết hợp tuyệt vời vì C ++ là ngôn ngữ mạnh mẽ và .NET framework được ưa thích để lập trình GUI trên Windows, như tôi đã đọc. Có thể viết GUI bằng C # và chức năng trong C ++ không?


7
C # cũng là một ngôn ngữ rất mạnh mẽ.
Adam Crossland

2
@Ramhound: Hoàn toàn không đúng khi C ++ / CLI mạnh như C #. Mã C ++ / CLI chứa tất cả các tối ưu hóa từ trình biên dịch C ++ và có thể thực thi nhanh hơn, và vẫn chứa nhiều kỹ thuật siêu lập trình và tiền xử lý không có trong C #.
DeadMG

2
Thêm vào đó, không nên có bất kỳ thách thức nào để nhận C # nếu một người giỏi về C ++. Tôi không nói nhưng tôi đang nói.
Giàn khoan

4
Cho rằng bạn biết C ++, bạn sẽ có lựa chọn giữa việc học C ++ / CLI hoặc C #. C ++ thực tế cũng không. Tôi khuyên bạn nên học C # thay vì cố gắng làm việc với C ++ / CLI; C ++ / CLI không phải là ngôn ngữ bản địa ở bất cứ đâu, vì vậy bạn sẽ tìm thấy rất nhiều sách và hỗ trợ cho C #.
David Thornley

6
@ddacot không, C ++ hoàn toàn không có nghĩa là để phát triển trò chơi. Nó có nghĩa là để phát triển phần mềm, giống như tất cả các ngôn ngữ lập trình khác. Trò chơi chỉ là một loại phần mềm.
MattDavey

Câu trả lời:


21

Có, trước đây nó được gọi là Managed C ++ và bây giờ là C ++ / CLI . Bạn có quyền truy cập vào toàn bộ .NET Framework (GUI: WinForms, GDI +, v.v.) như bạn có thể sử dụng từ ba ngôn ngữ được quản lý đi kèm khác, C #, F # và VB.NET.


+1 Theo câu trả lời của Jesse. Nếu tôi không nhầm, C ++ / CLI không hỗ trợ nhiều kế thừa. Vì vậy, hãy chuẩn bị cho một số tính năng bất ngờ. Một số tính năng này đến từ những hạn chế của CLI. Tôi khuyên bạn nên cố gắng tìm sự khác biệt giữa C ++ / CLI và 'cổ điển' C ++ trước khi bạn bắt đầu sử dụng nó.
Igor Soloydenko

Điều này được đề cập trong một số chi tiết trong liên kết đầu tiên. Do đó, tóm tắt là: "C ++ đã phát triển theo thời gian và hầu hết các phần mềm được viết bằng ngôn ngữ đều hướng đối tượng. Managed C ++ và việc sử dụng các lớp và các đối tượng dựa trên lớp vẫn phổ biến như trong Visual C ++. Thay đổi lớn duy nhất đối với điều này trong Managed C ++. là các khả năng của nhiều kế thừa không được hỗ trợ. Điều này là do giới hạn của CLR. Một lớp được quản lý theo trình thu gom rác của CLR không thể thừa kế nhiều hơn một lớp. "
Jesse C. Choper

Vậy là được rồi. Thật ra, tôi không giỏi về C ++. Tôi chỉ nghĩ rằng có thể có một sự khác biệt quan trọng khác có thể gây ra vấn đề.
Igor Soloydenko

Lần trước tôi đã viết một số C ++ theo nghĩa đen vào khoảng thế kỷ trước :)
Jesse C. Choper

1
@keykeeper, một cách sử dụng điển hình của C ++ / CLI là một cầu nối mỏng manh giữa thư viện C ++ không được quản lý và thế giới được quản lý. Nó là đủ cho việc sử dụng như vậy. Tất nhiên nó không có nghĩa gì để mã hóa một cái gì đó có kích thước lớn trong đó.
SK-logic

6

Đừng quên tùy chọn linh hoạt và đơn giản nhất, điển hình cho thế giới Unix, nhưng, vì một số lý do, không phổ biến trong Windows: chia GUI và logic thành các quy trình khác nhau, giao tiếp qua bất kỳ hình thức RPC hợp lý nào (ví dụ, ngay cả một đường ống nên công việc). Tốt nhất là với một giao thức văn bản đơn giản, dễ đọc của con người.

Bằng cách này, bạn có thể triển khai GUI (hoặc GUI khác nhau) với bất kỳ công nghệ nào bạn thích và xây dựng các thành phần logic từ bất kỳ thứ gì phù hợp với nhu cầu tốt hơn - C ++, tập lệnh, bất cứ thứ gì khác.

Tôi không nhận thấy bất kỳ lợi thế hợp lý nào của phương pháp thiết kế nguyên khối từ thế giới Windows.


4

Tôi đã làm điều này một lần cách đây vài năm, vào thời của Managed C ++. Chúng tôi đã có một số logic kinh doanh trong một DLL được nhân bản mà chúng tôi muốn kết hợp vào GUI kiểu thuật sĩ được viết bằng C #. Để thực hiện điều này, tôi đã tạo một hội đồng Managed C ++ để ngồi giữa ứng dụng GUI được quản lý và DLL không được quản lý và sử dụng System :: Runtime :: InteropService :: Marshal trong hội đồng đó để chuyển đổi các giá trị từ các loại được quản lý (System :: Int32) sang không được quản lý loại (int) và ngược lại.

Mặc dù Managed C ++ dường như không được dùng nữa, nhưng hiệu trưởng tương tự có thể áp dụng cho C ++ / CLI.


3

Không hẳn vậy. Có một ngôn ngữ lai C ++ / CLI, nhưng nó chỉ tốt cho sự tương tác (chính sách chính thức của Microsoft). Do cách thiết kế .NET framework, có nhiều ngữ nghĩa ngôn ngữ thực sự không phù hợp khi chạy trên CLR và C ++ trưng bày nhiều trong số chúng.


7
Tôi không đồng ý với tuyên bố này. C ++ / CLI hoàn toàn phù hợp cho nhiều triển khai.
Ramhound

3
@Ramhound: Bản thân Microsoft chỉ đề xuất nó cho sự tương tác. Đó là chính sách chính thức của họ.
DeadMG

2
@DeadMG bạn có thể cung cấp một nguồn cho điều đó?
sq33G

1
@DeadMG, bạn sai rồi. Có rất nhiều tùy chọn để chạy .NET GUI với logic gốc.
SK-logic

2
@DeadMG - Trừ khi bạn cung cấp bằng chứng rằng đó là chính sách chính thức của Microsoft (tôi không tin điều đó trong một phút) thì bạn mới chuyển qua FUD
Ramhound

3

Góc C ++ / CLI đã được bao phủ bởi rất nhiều câu trả lời cho đến nay, nhưng một cách khác để làm điều này là sử dụng PInvoke. Điều này cho phép các chương trình C # gọi các hàm có trong dll được viết bằng C ++. Ưu điểm của PInvoke là dll của bạn hoàn toàn không biết gì về thực tế rằng nó sẽ được gọi từ .Net. Điều này có nghĩa là bạn có thể gọi dll mà bạn không có mã nguồn và ngay cả khi bạn đã nhập mã nguồn, bạn sẽ không phải biên dịch lại bằng tùy chọn / clr. Điều này có nghĩa là bạn có thể sử dụng dll này với các chương trình C ++ khác, cũng như các chương trình C #. Có một số thư viện C / C ++ tuyệt vời hiện có: PInvoke cho phép bạn tận dụng những thư viện này. Đôi khi các thư viện Win32 cung cấp các chức năng không có sẵn trong .Net: PInvoke cho phép bạn sử dụng chúng.

Một trong những phần khó nhất khi sử dụng PInvoke là biết cách chuyển đổi chữ ký không được quản lý thành chữ ký được quản lý. Nhưng có một cheatsheet để giúp đỡ với điều đó.


Nhưng khi P / Gọi trực tiếp C ++, hãy chú ý đến việc xáo trộn, hoặc tốt hơn là cung cấp một trình bao bọc C mỏng ở giữa.
SK-logic

0

Bạn cũng có thể làm việc với thì là C # thông qua COM (Mô hình đối tượng thành phần). Đối với tôi COM đã tốt hơn khi sử dụng Managed C ++ vì Visual Studio 2010 không có thông tin chi tiết cho Managed C ++. Trong trường hợp của tôi, chúng tôi đã có một ứng dụng C ++ lớn nhưng muốn thử chuyển từ MFC sang WinForms hoặc WPF.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.