2009-06-20 35 views
21

Tôi đang làm việc trên dự án C++ mà tôi không có ý định phát triển hoặc triển khai bằng cách sử dụng thư viện .NET hoặc các công cụ, điều đó có nghĩa là tôi có thể tạo nó bằng cách sử dụng Visual Ứng dụng Studio Win32 Console. Tuy nhiên, tôi đã nghe nói rằng khả năng gỡ lỗi khi sử dụng một ứng dụng CLR trong Visual Studio là mạnh hơn rất nhiều. Vì vậy, tôi có một vài câu hỏi:Ứng dụng Bàn điều khiển Win32 so với ứng dụng CLR Console

  1. Có đúng là ứng dụng CLR so với ứng dụng Win32 có thêm khả năng cho quá trình phát triển của bạn ngay cả khi bạn không sử dụng bất kỳ thư viện .NET hoặc tài nguyên nào khác không? Nếu vậy, tôi vẫn có thể phát triển/biên dịch dự án như một dự án CLR để tận dụng lợi thế của chúng ngay cả khi tôi đang phát triển một dự án C++ thuần túy sử dụng STL, v.v. và không tận dụng lợi thế của bất kỳ Chức năng .NET? Hay một dự án như vậy đòi hỏi những khác biệt cơ bản mà sẽ làm cho nó không tầm thường để quay trở lại, có nghĩa là tôi nên gắn bó với một ứng dụng giao diện điều khiển Win32?

Trả lời

25

Câu trả lời cuối cùng, nếu bạn không bao giờ có ý định sử dụng CLR hoặc bất kỳ đối tượng .Net nào trong ứng dụng của mình, chỉ cần sử dụng thư viện Win32 C++ bình thường. Làm bất cứ điều gì khác sẽ khiến bạn đau đớn trên đường.

Bây giờ, để trả lời câu hỏi ban đầu về gỡ lỗi, có gỡ lỗi với CLR có những ưu điểm nhất định khi gỡ lỗi ứng dụng C++ thông thường. Bắt đầu với Visual Studio 2005, cả C# và VB.Net bắt đầu tập trung vào việc hiển thị biến trong cửa sổ đồng hồ/ô tô/đồng hồ có giá trị hơn nhiều. Nó chủ yếu được thực hiện thông qua việc giới thiệu các thuộc tính .Net như DebuggerDisplay, DebuggerTypeProxy và khung công cụ visualizer.

Nếu bạn không sử dụng bất kỳ loại .Net nào, bạn sẽ không nhận được bất kỳ lợi ích nào trong số này.

Trình đánh giá biểu thức C++ không tận dụng lợi thế của bất kỳ điều nào trong số này. Nó có các phương pháp tùy biến hiển thị kiểu của riêng nó. Nhưng nó không phải là đặc trưng (hoặc có khả năng nguy hiểm) như kiểu thuộc tính vì nó không cho phép mã chạy trong quá trình gỡ lỗi.

Điều đó không có nghĩa là gỡ lỗi C++ cung cấp trải nghiệm kém. Nó chỉ là khác nhau và có hiển thị tốt hơn cho nhiều loại container STL.

Gỡ lỗi ứng dụng CLR cũng có một số nhược điểm nhất định. Ví dụ, gỡ lỗi mã tối ưu hóa là gần như không thể ở lần vì JITer sẽ ẩn các biến địa phương, các thông số và thường "này". Gỡ lỗi một ứng dụng C++ được xây dựng tương tự cũng có thể gây phiền toái nhưng bạn luôn có thể lấy thanh ghi và phân tích để xem điều gì đang xảy ra. Làm như vậy cho một ứng dụng CLR là khó khăn nhất.

+0

Rất cám ơn câu trả lời chi tiết của bạn! Tôi đã tự hỏi nếu bạn có thể xây dựng một chút về tuyên bố đầu tiên của bạn và giải thích những loại vấn đề như một thiết lập có thể phải đối mặt với lâu dài? Điều đó chủ yếu đến từ vô tình bằng cách sử dụng các đối tượng/tính năng .NET, để chúng biên dịch tốt, và sau đó phải thay đổi các phần mã của bạn được nhúng sâu trong ứng dụng sau này? – bsofman

+0

@bsofman, về cơ bản là có. Để cả hai tận dụng lợi thế của CLR và triển khai mà không có CLR, bạn cần 2 cấu hình xây dựng (một cho mỗi cái). Sự khác biệt giữa các ngôn ngữ sẽ hiển thị trong lỗi xây dựng trong một cấu hình nhưng không phải là khác và sẽ kết thúc được khá khó chịu – JaredPar

2

Tôi nghĩ việc biên dịch mã C++ gốc thành CLR sẽ mở ra toàn bộ các sâu. Trừ khi bạn có đầu tư lớn vào mã C++ hiện có và một số điều cần thiết để chạy mã với các loại được quản lý, đây là điều bạn muốn tránh. Ví dụ, C++/CLI là một cách để đóng gói mã C++ gốc ngay vào một hội đồng CLR, nhưng C++/CLI thêm cú pháp không chuẩn vào ngôn ngữ C++, và sử dụng các kiểu C++ gốc trộn với các kiểu được quản lý. vấn đề khó khăn để nói rằng ít nhất.

Vì vậy, trong kết luận, tôi chỉ giữ nó như một ứng dụng gốc. Nếu bạn có bất kỳ kế hoạch chuyển nó vào CLR và bạn vừa bắt đầu làm việc với dự án này, tôi sẽ nghiêm túc nghĩ đến việc bắt đầu viết bằng ngôn ngữ bản địa CLR như C#.

+0

C + + CLI là đáng sợ! – toto

1

Câu trả lời này sao chép từ đây - http://social.msdn.microsoft.com/Forums/vstudio/en-US/895ecb47-8b34-4a1a-a20b-fda1e5e576eb/whats-the-difference-between-clr-console-application-and-win32-console-application

sự khác biệt giữa CLR console ứng dụng và win32 console ứng dụng là gì? - Trước đây sử dụng Common Language Runtime (nói cách khác, .NET framework); cái sau không.

và tôi không thể sử dụng Hệ thống không gian tên theo mô hình ứng dụng bảng điều khiển win32. - Không gian tên hệ thống là một phần của .NET framework.

Tôi nên làm gì khi muốn sử dụng không gian tên? - Bạn nên viết một ứng dụng .NET.

và không có gợi ý đầu vào như trong mô hình C#? - Thực sự không có IntelliSense cho C++/CLI trong các phiên bản hiện tại của Visual Studio. Nếu bạn muốn có một ứng dụng .NET, C# có thể là một lựa chọn ngôn ngữ tốt hơn.

Các vấn đề liên quan