2013-03-02 17 views
6

Tôi muốn sử dụng một số mã F # trong C++ gốc. Chính xác hơn, tôi muốn viết một số cấu trúc dữ liệu trong F # và sau đó sử dụng chúng trong mã C++ của tôi.Bất kỳ ý tưởng nào về cách tích hợp mã F # với C++ gốc?

Tôi không biết làm cách nào để kết hợp F # được quản lý với C++ không được quản lý. Làm thế nào tôi có thể tạo một lớp keo?

+0

http://msdn.microsoft. com/en-gb/library/x0w2664k.aspx – Rob

+2

@Rob Điều đó dường như là nhiều hơn về việc sử dụng mã không được quản lý từ quản lý, trong khi câu hỏi là (có vẻ như với tôi) theo cách khác xung quanh. –

+0

Bạn có thể chạy F # _code_ từ C++, nhưng cấu trúc dữ liệu bạn phải viết lại trong mỗi ngôn ngữ trừ khi bạn liên quan đến COM. – ildjarn

Trả lời

7

Một cách là tạo một hội đồng trong C++/CLI sẽ là cụm chế độ hỗn hợp có thể tham chiếu cụm F# và xuất biểu tượng gốc cùng một lúc để chúng có thể được sử dụng trong thư viện gốc C++ sau này. Tùy chọn này là linh hoạt nhất. Bạn có thể sử dụng phương pháp này để tạo 'cầu nối' hoạt động theo cả hai cách.

Một cách tiếp cận tôi thích sử dụng khi tôi làm điều này (và tôi đã làm điều này để bao gồm C#, WPF dựa GUI bên khác, ứng dụng C++/MFC bản địa) được tạo ra đơn giản C-bindings, như thế này:

//C++ 
void Method1() { Bridge::Method1(); } 
void Method2(int param, int* nativeArray) 
{ 
    array<int>^ managedArray = marshalArray(); 
    Bridge::Method2(param, managedArray); 
} 
.... 

//C# 
static class Bridge 
{ 
    public static void Method1() { ... } 
    public static void Method2(int param, int[] ar) { ... } 
} 

Điều này về cơ bản cho phép bạn giữ C++/CLI trình bao bọc càng nhỏ càng tốt, tận dụng toàn bộ mã để quản lý thư viện, cũng như cho phép bạn sử dụng thư viện này từ C và thậm chí tải động với LoadLibrary().

Một số có thể nói đây là quá mức cần thiết (bạn viết một số mã ống nước hai lần).

Nếu bạn muốn làm điều gì đó điên bạn cũng có thể thử và phương pháp xuất khẩu duy nhất từ ​​bạn F# thư viện trực tiếp, về cơ bản làm cho nó một hội đồng hỗn hợp mã, như mô tả trong bài viết Simple method of dll export without C/CLI