2012-01-18 79 views
7

câu hỏi đầu tiên của tôi ở đây :)Làm cách nào để chuyển danh sách các đối tượng từ C++ sang C#?

tôi đang làm việc với một ứng dụng viết bằng C++ (một trình soạn thảo bản đồ cho một trò chơi) có cuối UI trước viết bằng C#. Kể từ khi tôi mới đến C# tôi đang cố gắng làm càng nhiều càng tốt về phía C + +.

Từ C# i muốn gọi hàm C++ sẽ trả về danh sách các cấu trúc với các kiểu biến đơn giản (int và chuỗi) để tôi có thể điền một ListBox mà tôi có trong giao diện người dùng với chúng. Điều này có thể không? Làm thế nào tôi nên viết chức năng nhập dll trong C#?

Tôi đã thử tìm kiếm câu trả lời ở đây, nhưng tôi chỉ tìm thấy bài đăng về cách chuyển danh sách từ C# sang C++.

C++ mã:

struct PropData 
{ 
PropData(const std::string aName, const int aId) 
{ 
    myName = aName; 
    myID = aId; 
} 

std::string myName; 
int myID; 
}; 

extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData() 
{ 
std::vector<PropData> myProps; 

myProps.push_back(PropData("Bush", 0)); 
myProps.push_back(PropData("Tree", 1)); 
myProps.push_back(PropData("Rock", 2)); 
myProps.push_back(PropData("Shroom", 3)); 

return myProps; 
} 

Chức năng C# nhập khẩu:

[DllImport("MapEditor.dll")] 
    static extern ??? GetPropData(); 

EDIT:

Sau khi bài từ Ed S. Tôi đã thay đổi C++ mã để struct PropData { PropData (const std :: string aName, const int aId) { myName = aName; myID = aId; }

std::string myName; 
    int myID; 
}; 

extern "C" _declspec(dllexport) PropData* _stdcall GetPropData() 
{ 
    std::vector<PropData> myProps; 

    myProps.push_back(PropData("Bush", 0)); 
    myProps.push_back(PropData("Tree", 1)); 
    myProps.push_back(PropData("Rock", 2)); 
    myProps.push_back(PropData("Shroom", 3)); 

    return &myProps[0]; 
} 

và C# để [DllImport ("MapEditor.dll")] extern tĩnh PropData GetPropData();

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

    private void GetPropDataFromEditor() 
    { 
     List<PropData> myProps = GetPropData(); 
    } 

nhưng tất nhiên điều này không biên dịch thành GetPropData() không trả lại bất kỳ điều gì dịch sang danh sách.

Cảm ơn rất nhiều Ed S. đã giúp tôi đạt được điều này!

Trả lời

9

Bạn sẽ không thể sửa đổi số std::vector thành lãnh thổ C#. Những gì bạn nên làm thay vì trả về một mảng. Gắn bó với các loại cơ bản làm cho mọi thứ trở nên đơn giản hơn nhiều khi đối mặt với các tình huống interop.

std::vector đảm bảo rằng & v [0] trỏ đến phần tử đầu tiên và tất cả các phần tử được lưu trữ liên tục, vì vậy chỉ cần chuyển mảng trở lại. Nếu bạn đang mắc kẹt với giao diện C++ vì nó là (mà tôi không nghĩ bạn là), bạn sẽ phải xem xét một số cơ chế phức tạp hơn như COM.

+0

Anh ấy cũng không thể sử dụng cấu trúc? Tất nhiên nó sẽ là công bằng dễ dàng hơn để làm tất cả mọi thứ trong một ngôn ngữ. Nếu front-end được viết bằng C#, bạn có thể thực hiện mọi thứ trong C#. –

+0

Cảm ơn bạn đã trả lời nhanh, nhưng tôi cần thêm trợ giúp với cú pháp C#, vì tôi đã nói tôi mới sử dụng ngôn ngữ (chỉ mới bắt đầu hôm nay), tôi thậm chí không biết nó có thể xử lý con trỏ. – Cousken

+0

@Ramhound: Tôi không thấy cách bạn có thể tạo cấu trúc C# bắt chước chính xác 'std :: vector'. Điều đó chỉ hoạt động đối với các loại POD. –

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