Những tình huống thích hợp cho C # đến C interop?


8

Cho rằng C # có unsafetừ khóa, có những tình huống trong đó vẫn có ích khi tương tác với các thư viện C không?

Tôi có thể thấy sự cần thiết của việc bẻ khóa số rất nhanh, thao tác đồ họa hoặc hoạt động ma trận, sử dụng các thư viện C có sẵn. Nhưng có một trường hợp sử dụng để viết DLL của Greenfield, giả sử, C99 và tương tác với chúng từ C # không?

Tôi tưởng tượng rằng có thể có các trường hợp cạnh khi thả xuống C (theo nghĩa là nó gần với kim loại hơn) sẽ là cách duy nhất để có được các đặc tính hiệu suất cần thiết.


Làm thế nào điều này có liên quan đến C99? Đặc biệt là nếu bạn đang sử dụng C #, có khả năng bạn sẽ sử dụng Visual Studio, mà AFAIK không hỗ trợ C99.
Svick

Đó là một phần lý do tại sao tôi chỉ định C99. Những lý do cần phải đủ hấp dẫn để khiến tôi phải có một trình biên dịch mới để làm điều đó và dù sao thì VS cũng đã có C ++.
Robert Harvey

Câu trả lời:


4

Có một vài điều C có trên C #.

Có thể thực hiện mã thời gian thực với C. Không phải windows là nền tảng tốt nhất cho nó. Nhưng tôi đã thực hiện các hệ thống kiểm soát thời gian thực với nó. Sẽ rất tuyệt nếu làm điều đó trong C #, và hầu hết thời gian có thể dự đoán được, nhưng không phải lúc nào cũng vậy, và đó là kẻ giết người đối với các hệ thống RT.

Tính di động của mã C trên một số nền tảng (không chỉ linux / windows, mà bất kỳ số lượng hệ thống nhúng nào). Tôi sử dụng những thứ như mã hóa và nén từ windows sang các thiết bị nhúng, thay vì có phiên bản mã C và C #, dễ dàng có một thư viện với C # interop.


À, vậy thì về cơ bản bạn có được sự kiểm soát hoàn toàn đối với việc cấp phát và xử lý bộ nhớ (tức là bạn không phải lo lắng về việc thu gom rác không xác định). Nhưng có nhiều cách để kiểm duyệt vấn đề đó trong C #, phải không?
Robert Harvey

4
Về cơ bản, bạn đã mô tả khi nào bạn sẽ sử dụng C trên C #. Nhưng đó không phải là câu hỏi, câu hỏi là về interop, và tôi chưa thực sự giải quyết điều đó, tôi nghĩ vậy.
Svick

4

Đầu tiên, unsafehữu ích cho nhiều hơn C interop. Ví dụ, thực hiện phân tích hình ảnh với dữ liệu pixel thực tế có thể chậm khủng khiếp khi ở chế độ "an toàn". Lật sang chế độ không an toàn và thực hiện cùng một công việc với quyền truy cập trực tiếp vào bộ đệm hình ảnh, là một thứ tự cường độ nhanh hơn.

Thực hiện phát triển bán buôn trong C / C ++ để đưa vào một dự án .Net chắc chắn có thể có ý nghĩa, nhưng tất cả đều đi vào hiệu suất. Lời khuyên kinh điển sẽ là viết toàn bộ ứng dụng bằng ngôn ngữ bạn chọn, sau đó là hồ sơ. Khi bạn tìm thấy một phần quan trọng của mã mất 50% thời gian xử lý và không thể điều chỉnh thực tế nữa trong khi sử dụng ngôn ngữ được quản lý, sau đó triển khai lại một thói quen đó trong C và tích hợp.

Một ví dụ thực tế: Tôi đã tạo ra một thuật toán tìm đường. Sau khi cho thấy nó hoạt động với C #, tôi cần làm cho nó đủ nhanh để chạy nhiều lần trong một giây. Tôi đã xây dựng một số UI hỗ trợ tốt trong C # cho thấy tất cả các yếu tố được sử dụng cho các quyết định định tuyến, kết quả, v.v. Vì vậy, tôi đã thực hiện lại phần cốt lõi của thuật toán định tuyến trong C ++. Nếu tôi đã bắt đầu trong C ++, tôi nghi ngờ rằng tôi đã đi được xa.


2

Nhưng có một trường hợp sử dụng để viết DLL của Greenfield, giả sử, C99 và tương tác với chúng từ C # không?

Trường hợp sử dụng chính mà tôi thấy là khi bạn định viết một lib đặc biệt được nhắm mục tiêu cho nhiều nền tảng có sẵn C hoặc C99, nhưng C # không hoặc chỉ dành cho một vài trong số họ ("C #" có thể không có sẵn cho tổ chức lý do, không chỉ là kỹ thuật thuần túy).

Một trường hợp sử dụng khác là khi bạn có một chuyên gia trong lĩnh vực nào đó (ví dụ, một chuyên gia về một phần cứng cụ thể) và anh ta có nhiệm vụ mã hóa một số kiến ​​thức chuyên môn của mình vào thư viện, nhưng chuyên gia đó có 30 năm kinh nghiệm về C nhưng không có gì trong C #.

Một điều cần xem xét: "100% sân xanh" là một tình huống rất hiếm gặp hiện nay. Đối với hầu hết các loại vấn đề, ít nhất có một số giải pháp tồn tại hoặc các giải pháp tương tự có thể được sử dụng lại khi sửa đổi. Vì vậy, việc sử dụng C có ý nghĩa rất lớn khi bạn phải xây dựng một cái gì đó mới trên cơ sở mã C hiện có.


Đối với tôi, DLL của Greenfield sẽ giống như các phương trình đặc biệt hoặc biến đổi có thể được cắm vào hệ thống thời gian thực. (vẫn được thực hiện trong C nơi tôi làm việc).
Robert Harvey

@RobertHarvey - Tôi nghĩ rằng bạn có thể thay thế "tính nhất quán" thay vì "SME biết C" trong câu trả lời của Doc và có cùng ý nghĩa. Và như Keith ngụ ý trong câu trả lời của mình, nếu bạn đang viết cho một hệ thống thời gian thực cứng thì bạn có thể chỉ đơn giản muốn có sự đảm bảo mà thư viện C sẽ cung cấp.

1

Có, để giao tiếp với phần mềm cũ. Tôi đã phải tạo một DLL interop có thể được sử dụng bởi ứng dụng C kế thừa của tôi để tận dụng lợi thế của công nghệ không có sẵn khi bộ công cụ của tôi được phát minh.

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.