2009-06-19 40 views
8

Tôi đang viết một ứng dụng nhỏ yêu cầu một vài hộp danh sách, các nút, hộp văn bản. Nó sẽ được liên kết với Boost, MySQL, vv. Dự án yêu cầu các hàm win32. Tôi con số Winforms sẽ được sử dụng tốt (MFC và CodeJock yêu cầu quá nhiều thời gian)..NET GUI - C# vs C++/CLI

Vì vậy, C + +/CLI có vẻ hoàn hảo cho công việc. Chỉ cần sử dụng tiêu chuẩn C++ bên cạnh GUI. Sau đó, tôi chạy qua chủ đề đề nghị bạn viết GUI của bạn trong C# thay thế. Sau đó, sử dụng giao diện p/Invoke (slow) hoặc C++/CLI cho C++ DLL chuẩn của bạn.

Ví dụ: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6ae877ac-07b4-4d26-8582-de475ee9a5cb

Tại sao? Những lợi thế là có trong việc sử dụng C# cho winforms GUI của bạn thay vì C + +/CLI (họ trông giống nhau, các lệnh đều giống nhau). Những bất lợi là có trong việc sử dụng C++/CLI thực thi thay vì thực thi chuẩn C++. Tôi có thể hiểu được nếu khả năng tương thích đa nền tảng là một vấn đề, nhưng sau đó bạn có thể chỉ đơn giản là không sử dụng các tính năng được quản lý (ngoài GUI).

Tôi không hiểu tại sao bạn sử dụng C# và sau đó đi xa đến mức để tách nó bằng "DLL động cơ". Trừ khi tất nhiên "DLL động cơ" đang được sử dụng cho các ứng dụng khác.

Cảm ơn

+3

P/Gọi không chậm nếu được sử dụng đúng cách. Ứng dụng của chúng tôi là khoảng 30k dòng C# và 200k + của C++ được gọi với P/Invoke và nó quản lý các khung hình tương tác với hoạt ảnh/v.v. Bạn chỉ cần chắc chắn rằng giao diện của bạn giữa C# và DLL (s) được sạch sẽ và tối thiểu. –

+0

@RonWarholic Tôi không quen thuộc với P/Invoke, nhưng không phải là nó tẻ nhạt để viết lại hoàn toàn các khai báo hàm của 200k dòng mã? – MasterMastic

+0

Nếu bạn giữ API tiếp xúc của bạn sạch sẽ và chặt chẽ thì không có nhiều viết lại. Có hàng ngàn chức năng trong thư viện nhưng chỉ có 80 hoặc hơn được tiếp xúc với bên C#. –

Trả lời

19

Tôi nghĩ rằng hầu hết các kiến ​​nghị liên quan đến trung tâm câu hỏi này trên thực tế là C# chỉ là một môi trường tốt hơn để tạo ra các ứng dụng NET với hơn so với C++/CLI với. Cú pháp là sạch hơn, các công cụ là tốt hơn - cả trong Visual Studio và từ các bên thứ 3. Bạn sẽ nhận được sự hỗ trợ nhiều hơn và tốt hơn từ các nhà phát triển, những người hầu như sẽ quen thuộc hơn với C#.

Ứng dụng C++/CLI đủ khác với tiêu chuẩn C++ với tất cả ký tự^và% mà ít nhất tôi cảm thấy nó KHÔNG phải là C++.

Hầu hết lời khuyên cũng đến từ quan điểm mà bạn muốn tạo một ứng dụng .NET và C++/CLI được sử dụng nhiều hơn như một lớp keo dán. Bất cứ khi nào tôi đã sử dụng C++/CLI, nó đã được grudgingly và hầu như luôn luôn bởi vì một số thư viện của bên thứ ba đã có nhiều phức tạp C/C + + đối tượng mà nó thông qua xung quanh. Khi sử dụng C# và P/Invoke, bạn thường phải tạo các lớp để phản chiếu các cấu trúc và các lớp có trong các tệp tiêu đề C++ của phần mềm mà bạn đang giao tiếp. Giữ cho những người đồng bộ là lao động chuyên sâu và làm cho những sai lầm là dễ dàng để làm. Hơn nữa, tìm hiểu làm thế nào để sắp xếp một cấu trúc với con trỏ đến cấu trúc của mảng struct sẽ làm cho bộ não của bạn tan chảy!

Lời khuyên chung của tôi là sử dụng C# (hoặc VB.NET) để tạo nhiều mã nhất có thể cho ứng dụng của bạn. Sử dụng P/Gọi khi nhu cầu của bạn để gọi API Win32 và/hoặc SDK của bên thứ ba bị hạn chế và các giao diện và thông số rất đơn giản. Sử dụng C++/CLI như một lớp keo khi điều này là không thể.

Trong môi trường nhóm, các nhà phát triển đồng nghiệp của bạn sẽ cảm ơn bạn vì đã giới hạn việc sử dụng C++/CLI của bạn chỉ ở những nơi hoàn toàn, được yêu cầu tích cực. C++/CLI chuyên môn chỉ là không phổ biến.

+0

Tránh C++/CLI nếu * ở tất cả * có thể - như một coder C++ CLI tất cả những gì tôi có thể nói là - lời khuyên tuyệt vời. Bỏ qua nó ở những người nguy hiểm của bạn! – mackenir

0

Tôi tự hỏi về điều này, vì vậy với Visual Studio 2008 tôi đã tạo một dự án Windows Forms Application mới sử dụng C++/CLI làm ngôn ngữ. Điều đầu tiên nó làm là ném lên một lỗi. Vì vậy, tôi lấy đó như là một dấu hiệu cho thấy công cụ này không phải là khá sẵn sàng để sử dụng. Có lẽ tôi không cho nó đủ cơ hội!

The file 'c:\source\Test\Test\Form1.h' does not 
support code parsing or generation 
because it is not contained within a 
project that supports code. 

Điều này xảy ra bất cứ khi nào tôi cố gắng mở file Form1.h wizard tạo.

+1

Làm việc tốt cho tôi. Nó cũng chạy native C++ nếu bạn đặt nó vào/clr và tắt/clr: pure. Vì vậy, bạn bắt đầu với giao diện người dùng Winforms tốt đẹp và sử dụng mã C++ bình thường của bạn. Tất nhiên tôi đặt cược $ 10 tôi sẽ gặp rắc rối trong một vài ngày với các thư viện/etc. và phải chuyển sang giao diện người dùng C# hoặc giao diện người dùng Qt. –

4

Cá nhân, tôi yêu C++/CLI, nhưng tôi vẫn muốn viết giao diện người dùng của mình trong C#.

C++/CLI là tuyệt vời để làm việc trực tiếp với Win32 hoặc nói chuyện với mã cũ, nhưng hơi quá chi tiết theo ý thích của tôi khi nói đến mã giao diện người dùng. Mã giao diện người dùng WinForms trong C# rất đẹp và đơn giản (đối với hầu hết các phần, haha). Viết mã UI trong C++ hầu như luôn lộn xộn (chỉ cần nhìn vào MFC).

Tại sao không chỉ tạo giao diện người dùng của bạn trong một C# lắp ráp và đặt tất cả các mã cấp thấp hơn của bạn trong một C + +/CLI lắp ráp? Điều tuyệt vời về C++/CLI là bạn có thể tạo một lớp được quản lý mà mã C# của bạn có thể dễ dàng gọi. Lớp được quản lý đó sau đó có thể dễ dàng chuyển tiếp các cuộc gọi đến một lớp C++ hoặc mã C thẳng.

+0

Đó chính xác là câu hỏi của tôi, tại sao tạo giao diện người dùng trong C# và tạo lớp quản lý C++/CLI để gọi mã C/C++ gốc. Vì vậy, về cơ bản sự khác biệt là một cú pháp tốt hơn/sạch hơn cho UI scripting và như một người nào khác chỉ ra C# UI có hỗ trợ công cụ tốt hơn. –

+0

có bao nhiêu lợi ích hiệu suất khi sử dụng C++/CLI cho những thứ liên quan đến, ví dụ: cấu trúc dữ liệu? STL có nhanh hơn đáng kể so với BCL cho các bộ sưu tập không? –

2

lợi thế gì là có trong việc sử dụng C# cho winforms GUI của bạn thay vì C++/CLI (họ đều giống nhau, các lệnh đều giống nhau)?

Chúng trông không giống nhau. C# là ý kiến ​​của tôi sạch hơn và có một số trừu tượng hữu ích. Công cụ hỗ trợ là tốt hơn ồ ạt cho C# hoặc VB.net cũng.

Look here for an example comparison

Và đừng quên tính năng ngôn ngữ hiệu quả như Lambda Expressions, LINQ, suy luận kiểu, vv mà có xu hướng nhấn C# đầu tiên và chảy xuống VB.net sớm đủ nhưng hiếm khi tìm đường xuống C++/CLI.

0

Tôi đang viết một ứng dụng nhỏ yêu cầu một vài hộp danh sách, nút, hộp văn bản. Nó sẽ được liên kết với Boost, MySQL, vv. Dự án đòi hỏi chức năng win32 ...

tôi có thể nhận được nguy cơ được downvoted, nhưng, nếu hầu hết các mã của bạn đã được viết bằng C++ và sử dụng C++ chức năng, nó woudn't được đơn giản để viết GUI của bạn trong Gốc C++.

Bạn không phải sử dụng MFC để tạo GUI. Hãy xem trên Qt4, chúng có hướng dẫn rất tốt để bạn có thể bắt đầu viết GUI bằng C++ trong vài giờ.

+0

WTL là một lựa chọn tốt cho giao diện người dùng Windows gốc. –

+0

Tôi đã xem xét Qt và trong hầu hết các trường hợp, bạn sẽ hoàn toàn chính xác. Dự án đặc biệt này chỉ là một chút quá nhỏ để bắt đầu học Qt4. Thêm vào đó, tôi muốn tìm hiểu thêm một chút về công cụ định hướng VS. Nếu tôi thực hiện một phiên bản thứ hai, tôi có thể sẽ chuyển đổi (một lý do khác ngoại trừ UI tôi không sử dụng mã được quản lý). –

0

Có vẻ như hầu hết mọi người tự động đề xuất sử dụng C# trên C++ giả sử bạn đã biết C# hoặc sẵn sàng đầu tư thời gian vào việc học nó. Tôi không thấy những gì tất cả các ghét trên C + +/CLI WinForms là. Ít nhất nếu bạn muốn chuyển qua mã C++ hiện tại, nó sẽ hoàn thành công việc. Ít nhất tôi đã tacked trên một GUI để hiện tại của tôi C + + bằng cách sử dụng WinForms/CLI. Vâng tôi có lẽ sử dụng C# nếu tôi đã bắt đầu từ đầu từ:

1 Tôi đã biết C

2 Tôi biết đó là dễ dàng hơn nhiều và nhanh hơn để mã sử dụng C

Nhưng như tôi đã nói nếu bạn đã có mã C++ đặt xung quanh bạn có thực sự muốn bắt đầu từ đầu?

+1

Một trong những vấn đề lớn nhất của trình biên dịch C++/CLI là, nó KHÔNG phải là một siêu của C++. Nếu bạn bắt đầu sử dụng công cụ C++ nâng cao (như các mẫu hoặc một số công cụ tốt đẹp từ tăng cường) thì C++/CLI chỉ chạy vào một số vấn đề. Trong trường hợp đó, bạn phải sử dụng pImpl-Idiom, để cho C++ nâng cao của bạn, trình biên dịch C++ chuẩn sẽ được gọi. Điều này dẫn đến nhiều mã boilerplate làm cho C++/CLI ít sử dụng được như tôi muốn. – Oliver