Tôi cho rằng điều này liên quan đến cùng một dự án cơ sở dữ liệu C# mà bạn đã đề cập trong câu hỏi.
Đó là về mặt kỹ thuật có thể để triển khai toàn bộ các lớp ghi trong C/C++ hoặc bất kỳ ngôn ngữ nào khác. Và nó là về mặt kỹ thuật có thể để có mọi thứ khác trong C#. Tôi hiện đang làm việc trên một ứng dụng sử dụng mã không được quản lý cho một số công cụ cấp thấp hiệu suất cao và C# cho logic nghiệp vụ và quản lý cấp cao hơn.
Tuy nhiên, mức độ phức tạp của tác vụ sẽ không được đánh giá thấp. Cách điển hình để thực hiện việc này là thiết kế hợp đồng mà cả hai bên đều có thể hiểu được. Hợp đồng sẽ được tiếp xúc với ngôn ngữ được quản lý và ngôn ngữ được quản lý sẽ kích hoạt các cuộc gọi đến ứng dụng gốc. Nếu bạn đã từng thử gọi phương thức C++ từ C#, bạn sẽ nhận được ý tưởng ... Thêm vào đó, mọi cuộc gọi tới mã không được quản lý đều có hiệu suất khá cao, điều này có thể làm giảm toàn bộ ý tưởng về hiệu suất ở mức thấp.
Nếu bạn thực sự quan tâm đến cơ sở dữ liệu quan hệ hiệu suất cao, hãy sử dụng một ngôn ngữ cấp thấp.
Nếu bạn muốn có một thực hiện ngây thơ, nhưng hoàn toàn làm việc của một cơ sở dữ liệu, chỉ cần sử dụng C#. Đừng trộn lẫn hai ngôn ngữ này trừ khi bạn hoàn toàn hiểu được sự phức tạp. Xem Raven DB - một cơ sở dữ liệu NoSQL dựa trên tài liệu được xây dựng hoàn toàn chỉ trong C#.
Mã C# không được quản lý của tôi có biên dịch sang IL và chạy trên CLR không?
Không, không có điều gì như không được quản lý C#. Mã C# sẽ luôn được biên dịch thành mã IL và được thực thi bởi CLR. Đó là trường hợp mã được quản lý gọi là mã không được quản lý. Không được quản lý mã có thể được thực hiện trong một số ngôn ngữ C/C++/Assembly vv, nhưng CLR sẽ không có ý tưởng về những gì đang xảy ra trong mã đó.
Cập nhật từ nhận xét. Có một công cụ (ngen.exe) có thể biên dịch C# trực tiếp thành mã cụ thể của kiến trúc gốc. Công cụ này được thiết kế để cải thiện hiệu suất của ứng dụng được quản lý bằng cách loại bỏ giai đoạn biên dịch JIT và đưa mã gốc trực tiếp vào hình ảnh hoặc thư viện thực thi. Mã này, tuy nhiên, vẫn được "quản lý" bởi máy chủ CLR - cấp phát bộ nhớ và quản lý, quản lý luồng, miền ứng dụng, xử lý ngoại lệ, bảo mật và tất cả các khía cạnh khác vẫn được kiểm soát bởi CLR. Vì vậy, mặc dù C# về mặt kỹ thuật có thể được biên dịch thành mã gốc, nhưng mã này không hoạt động như một hình ảnh gốc độc lập.
Tính năng này hoạt động như thế nào?
Managed đang tương thích với mã không được quản lý. Có một số cách để thực hiện việc này:
- Thông qua mã qua .Net Interop. Điều này tương đối nhanh nhưng trông hơi xấu trong mã (cộng với khó duy trì/thử nghiệm) (good article with C#/C/Assembly samples)
- Cách tiếp cận chậm hơn nhiều, nhưng mở rộng hơn với các ngôn ngữ khác: web wervices (SOAP, WS, REST và công ty), xếp hàng (như MSMQ, NServiceBus và những người khác), cũng có thể (có thể) liên lạc giữa các quá trình. Vì vậy, quy trình không được quản lý nằm ở một đầu và một ứng dụng được quản lý nằm trên một ứng dụng khác.
Bạn đề cập đến việc viết mã không được quản lý trong C#. Tôi giả sử bạn có nghĩa là điều này khác với * gọi * mã không được quản lý * từ * C#. Nếu vậy, tôi muốn xem một ví dụ về ý của bạn. –
Dựa trên câu trả lời của oleksii, những gì tôi đang tìm kiếm đơn giản là không tồn tại. Vì vậy, tôi không thực sự có thể cho bạn thấy một ví dụ. – kd8azz