2009-12-17 27 views
6

Toàn bộ ứng dụng của tôi (khá lớn, với 20MB thực thi) được viết bằng C++ không được quản lý. Bởi vì tôi có thể thấy rõ lợi thế trong việc sử dụng mã được quản lý, tôi muốn bắt đầu giới thiệu mã được quản lý trong ứng dụng của tôi, nhưng tôi bắt đầu từ đâu?Đơn đăng ký của tôi không được quản lý. Tôi bắt đầu giới thiệu mã được quản lý ở đâu?

Tôi có thể dễ dàng bắt đầu sử dụng C++/CLI và liên kết nó với phần còn lại của đơn đăng ký của tôi không? (mặc dù cú pháp C++/CLI có vẻ khá 'kỳ lạ').

Hoặc tốt hơn là chuyển sang C#, nhưng cách tốt nhất để 'liên kết' điều này cùng với mã C++ không được quản lý của tôi là gì?

Làm cho việc biên dịch tất cả mã C++ của tôi bằng tùy chọn/clr có hợp lý không? Điều này có hiệu quả không?

Tôi có phải lo lắng về việc đầm lầy không? Điều này cung cấp cho một chi phí hoặc tôi có thể chuyển đổi giữa quản lý và không được quản lý mà không có một hình phạt hiệu suất (giống như tôi đã làm 20 năm trước khi trộn fortran và C). Hiệu năng thực sự quan trọng trong ứng dụng của tôi vì nó là một ứng dụng khoa học đôi khi xử lý nhiều Gigabyte bộ nhớ.

Hoặc nó chỉ có ý nghĩa để thiết kế lại giao diện người dùng, và chỉ viết điều này trong C# và giữ phần còn lại của ứng dụng của tôi (logic tính toán, logic nghiệp vụ, giao diện cơ sở dữ liệu, ...) trong C++ không được quản lý?

Vì ứng dụng của tôi đôi khi cần xử lý nhiều Gigabyte bộ nhớ, tôi có phiên bản 64 bit. Có dễ dàng để có mã được quản lý 64 bit không? Woudl các bộ thu rác vẫn còn hiệu quả nếu có nhiều bộ nhớ được sử dụng?

Chỉ cần nêu rõ: tôi bắt đầu từ đâu?

Patrick

+2

Quản lý C++ không phải là cá và gà - Tôi muốn tránh nó nếu có thể. –

Trả lời

1

Hiện tại, hãy xem xét câu hỏi này đã đóng.

Tôi nhận ra rằng câu trả lời không được trộn lẫn C++ và C#, nhưng nhận được kiến ​​trúc ngay từ đầu.

Nếu kiến ​​trúc là chính xác và tách riêng nơi cần tách riêng, thay vì thay đổi các phần của ứng dụng bằng các mô-đun khác (bên ngoài, ngôn ngữ khác, ...) sẽ dễ dàng hơn.

Về các vấn đề về hiệu suất trong quá trình đầm lầy, chúng tôi sẽ phải đợi cho đến khi .Net tiếp tục phát triển.

1

hồ sơ các ứng dụng, quyết định vào những gì hội nhập điểm bạn có thể chụp ra khỏi dây chuyền C# của logic và đột nhập vào C++ và ngược lại. Sắp xếp chúng thành một kế hoạch để có một mẫu thiết kế mặt tiền di chuyển qua hệ thống dần dần thay thế C++ bằng C#. Mối quan tâm chính là chi phí CPU và bộ nhớ khi quyết định chuyển đổi ngôn ngữ tại mỗi ứng dụng Mặt tiền/giao diện.

Bạn sẽ muốn có thể kết hợp các chỉnh sửa để có thể tốt nhất với một bộ mã nguồn và kho mã nguồn cho mã C++ gốc và bộ và kho lưu trữ khác cho mặt tiền cộng với C#. Sau đó, khi cải tiến/bảo trì, bạn sẽ áp dụng nó vào cả hai cơ sở mã, và bạn cố gắng đảm bảo mặt tiền di chuyển qua hệ thống bắt đầu bằng mã ít có khả năng thay đổi trong các cải tiến hoặc bảo trì để giảm thiểu tối thiểu. tăng gấp đôi thay đổi.

Cũng lý tưởng cấu trúc công việc của bạn để bạn có thể cuộn ngược mặt tiền để quay trở lại 100% C++ khi thả mũ nếu bạn nhấn một nút.

Để kiểm tra xem một vài mô-đun C++ đặc biệt khó hiểu có thể được tách thành phần C++ và phần C# hay không, hãy chạy chúng trong hai quy trình Win32 C++ khác nhau giao tiếp bằng cách sử dụng đường ống hoặc ổ cắm. Bằng cách đó, bạn sẽ có được một ý tưởng tốt hơn về việc liệu có vấn đề với quản lý bộ nhớ hay hiệu suất cần sửa chữa trước khi bạn có thể tách chuỗi cuộc gọi tại thời điểm đó.

1

Chúng tôi thực hiện chính xác những gì bạn đã mô tả trong một ứng dụng quan trọng của sứ mệnh được hàng nghìn người dùng sử dụng. Về cơ bản, chúng tôi giữ ứng dụng hiện tại như vậy, vì vậy tệp thực thi vẫn là một tệp thực thi không được quản lý 100% (không phải C++/CLI). Sau đó, chúng tôi đặt tất cả mã C# mới của chúng tôi vào các tệp .dlls .NET bao gồm các đối tượng nghiệp vụ, điều khiển người dùng và mã gui, v.v.

Về cơ bản, tất cả mã mới được viết bằng C#. Chúng tôi có 1 dll đó là C + +/CLI đó chỉ là keo. Điều này cho phép chúng ta dễ dàng interop giữa mã được quản lý và không được quản lý, mà không cần phải tạo mã C++ hiện có. Điều này giới hạn số lượng mã C++/CLI mà chúng ta phải viết. Mã gốc nói với mã chế độ hỗn hợp, có thể nói chuyện với mã được quản lý. Dll chế độ hỗn hợp có thể móc các sự kiện trên các lớp C# để mã C# có thể kích hoạt sự kiện để giao tiếp với C++/CLI (có thể nói chuyện với mã gốc).

Chúng tôi cũng có thể lưu trữ .NET UserControls trong ứng dụng C++ hiện có (WinForms chỉ là một trình bao bọc xung quanh WINAPI, vì vậy nó hoạt động khá tốt).

Tính năng này hoạt động rất tốt và cho phép bạn giữ mã hiện tại mà không phải viết lại toàn bộ GUI trong C#.

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