2012-04-04 36 views
5

Chúng tôi có một dự án lớn chủ yếu được viết bằng C# (dịch vụ, đa luồng, v.v ...). Tuy nhiên, thuật toán crunching số lõi được viết bằng C++ không được quản lý để nhanh (OpenMP, v.v.).Sử dụng các thuộc tính C# trong mã C++ không được quản lý

Thật không may, hiện tại chúng tôi phải làm rất nhiều nỗ lực để trao đổi dữ liệu giữa hai thế giới này. Tức là, chúng ta phải viết các lớp gói trong C++/CLI cho mỗi lớp C++. Đối với (hầu như) bất kỳ thiết lập bắt buộc nào (Properties) trong C# - "thế giới" có một bản sao trong thế giới C++ (một tệp tiêu đề) và một chuyển đổi rõ ràng qua lại trong lớp trình bao bọc. Kiến trúc này có vẻ rất kém hiệu quả và khá dễ bị lỗi.

Câu hỏi chính: Có cách nào để chia sẻ C#-class với các thuộc tính bằng cách nào đó tự động trong C++ không được quản lý không? (chúng tôi phải đọc và viết!)

Câu hỏi phụ: Bạn có thể đưa ra bất kỳ lời khuyên nào về cách cải thiện kiến ​​trúc trong trường hợp như được mô tả ở trên không. Một trong những xem xét của chúng ta là hoàn toàn chuyển sang C + +, nhưng phải tìm thư viện thích hợp và viết mã sạch cho tất cả những thứ (system-) chúng tôi làm trong. NET tại thời điểm này không cảm thấy tốt.

Rất cám ơn sự giúp đỡ của bạn Trân trọng, Jakob

+0

Bạn đã xác minh rằng việc viết các thuật toán trong C# là một nút cổ chai? C# 4.0 có hỗ trợ tốt cho sự phát triển song song hiện nay. – Nick

+0

Không, chúng tôi chưa làm điều này, và bạn nói đúng: Chúng tôi nên cố gắng chắc chắn về điểm này. Nhưng khi chúng ta dựa vào các thuộc tính cụ thể của bộ nhớ đệm và giống như tôi thực sự nghi ngờ rằng thuật toán sẽ chạy với tốc độ tương tự trong CLR. –

+2

Làm thế nào về [Protocol Buffers] (http://code.google.com/p/protobuf/)? Có khả năng sử dụng nó cùng với C# sử dụng [protobuf-net] (http://code.google.com/p/protobuf-net/). – megabyte1024

Trả lời

1

tôi đang đối phó với vấn đề tương tự tại nơi làm việc của tôi, nơi công việc chính của tôi là viết giao diện quản lý để perfromance cao nhất định, dlls độ trễ thấp, điều này liên quan đến các trường hợp đơn giản nơi tôi phải bọc các lớp gốc bằng cách sử dụng đơn giản C++/cli chứa một con trỏ thô tới lớp gốc hoặc các vấn đề phức tạp hơn nơi mã gốc là một nhà xuất bản phía máy chủ và mã được quản lý phải đăng ký với nó bằng cách sử dụng delegate. được chuyển đổi thành gọi lại gốc. .NET dưới mui xe là một máy chủ COM tinh vi theo như tôi biết. Có thể viết các assembly .net với thuộc tính ComVisible được thiết lập là true sau đó nó hoạt động như một thành phần COM cổ điển và sau đó có thể sử dụng nó từ mã C++ nguyên gốc như một thành phần COM. Điều ngược lại là sử dụng mã nguồn gốc từ quản lý có thể đạt được bằng cách sử dụng thuộc tính DllImport và tất cả các Marshaling có thể được tinh chỉnh bởi các thuộc tính khác nhau như StructLayoutAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) và MarshalAsAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) Tôi cũng sử dụng đôi khi từ khóa không an toàn cũng. Tôi phải đối phó với mã hiệu suất cao vì vậy trong một số trường hợp, đó là sau khi profiling rằng tôi biết đó là giải pháp tốt nhất. Cho dù đó là giải pháp lớp warpper mà bạn đã đề cập hoặc cách COM cổ điển, hoặc một số loại lai với một số bộ nhớ đệm, đối tượng tổng hợp, vv

Hy vọng điều đó sẽ hữu ích. :)

Xin lỗi nếu điều đó có vẻ hơi bị vô tổ chức. Nó rất muộn ở đây. :)

+0

Cảm ơn câu trả lời của bạn - Tôi đã làm sạch rất nhiều mã wrapper của chúng tôi bằng cách sử dụng Marhsal.StructToPtr và đồng hành, và tôi hy vọng sẽ nhận được thậm chí xa hơn bằng cách sử dụng C++/CLI thành phần trong cả C# và bản địa C++ ... –

+0

Cảm ơn bạn Jakob S. – ervinbosenbacher

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