2012-04-19 34 views
25

Tiêu đề giải thích. Tôi có bản gốc C + + dlls mà tôi đang viết C++/CLI wrappers cho, mà lần lượt sẽ được nhập khẩu trong C# như tham chiếu.Trình bao bọc C++/CLI cho native C++ để sử dụng làm tham chiếu trong C#

Vấn đề là trong C# tôi không thấy các lớp tôi có trong trình bao bọc (được nhập từ DLL).

Tôi nên sử dụng từ khóa nào và CÁCH khai báo lại đối tượng C++ gốc của tôi để hiển thị trong C#?

+0

Các lớp trình bao bọc có được công khai không? Tuyên bố phải là "lớp ref công khai {...};" – Asik

+0

Tôi biết điều đó. Những gì tôi yêu cầu là một điều như vậy có thể: 'lớp ref công khai wrapper_class = native_class;'? Có phải các phương pháp như vậy có thể? – Haix64

+0

Nó không phải là đơn giản. Lớp wrapper sẽ lưu trữ một đối tượng native_class và tạo các phương thức wrapper cho tất cả các phương thức của native_class mà bạn muốn trưng ra. Các phương thức wrapper chỉ sắp xếp các tham số và ủy quyền cuộc gọi đến đối tượng native_class. – Asik

Trả lời

56

Ok, hướng dẫn. Bạn có lớp C++ NativeClass mà bạn muốn hiển thị với C#.

class NativeClass { 
public: 
    void Method(); 
}; 

1) Tạo dự án C++/CLI. Liên kết tới thư viện và tiêu đề C++ của bạn.

2) Tạo lớp trình bao bọc hiển thị các phương pháp bạn muốn. Ví dụ:

#include "NativeClass.h" 

public ref class NativeClassWrapper { 
    NativeClass* m_nativeClass; 

public: 
    NativeClassWrapper() { m_nativeClass = new NativeClass(); } 
    ~NativeClassWrapper() { this->!NativeClassWrapper(); } 
    !NativeClassWrapper() { delete m_nativeClass; } 
    void Method() { 
     m_nativeClass->Method(); 
    } 
}; 

3) Thêm tham chiếu vào dự án C++/CLI trong dự án C# của bạn.

4) Sử dụng các loại wrapper trong một tuyên bố sử dụng:

using (var nativeObject = new NativeClassWrapper()) { 
    nativeObject.Method(); 
} 

Những tuyên bố sử dụng đảm bảo Dispose() được gọi, mà ngay lập tức chạy destructor và phá hủy các đối tượng bẩm sinh. Bạn sẽ bị rò rỉ bộ nhớ và có lẽ sẽ chết khủng khiếp (không phải bạn, chương trình). Lưu ý: The Dispose() method is magically created for you.

+0

Tôi đang được thử thách bởi dll không tìm thấy lỗi, nhưng dù sao, phương pháp của bạn hoạt động. Cám ơn rất nhiều! – Haix64

+0

i theo hướng dẫn này nhưng nhận được lỗi như vậy "loại được sử dụng trong một tuyên bố sử dụng phải được chuyển đổi hoàn toàn thành 'System.IDisposable'" – javapowered

+1

Để tránh rò rỉ bộ nhớ từ 4), bạn nên bổ sung thêm finalizer! NativeClassWrapper(); sẽ được gọi bởi bộ thu gom rác – VladL

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