Как получить массив строк из собственного кода (C ++) в управляемом коде (C #) - PullRequest
4 голосов
/ 10 марта 2011

есть ли какой-нибудь способ, которым мы можем получить коллекцию строк из c ++ в c #

C # код

[DllImport("MyDLL.dll")]
private static extern List<string> GetCollection();
public static List<string> ReturnCollection()
{
    return GetCollection();
}

C ++ код

std::vector<string> GetCollection()
{
std::vector<string> collect;
return collect;
}

Приведенный выше код приведен только для примера, основная цель - получить коллекцию в C # из C ++, и помощь будет принята

// Jame S

Ответы [ 5 ]

4 голосов
/ 10 марта 2011

Существует множество способов решения этой проблемы, но все они гораздо сложнее, чем у вас есть в настоящее время.

Вероятно, самый простой способ передать строку, выделенную в C ++, в C # - это BSTR.Это позволяет вам выделить строку в вашем C ++ и позволить C #-коду освободить ее.Это самая сложная задача, с которой вы сталкиваетесь и сортируете ее, поскольку BSTR решает ее тривиально.

Поскольку вам нужен список строк, вы можете изменить его на сортировку в виде массива BSTR.Это один из способов, вероятно, я бы выбрал маршрут, но есть много других подходов.

3 голосов
/ 10 марта 2011

Я думаю, вам нужно преобразовать это во что-то более дружественное к C #, например, массив в стиле C из char или wchar_t строк в стиле C. Здесь вы можете найти пример std::string маршалинга.И здесь вы найдете обсуждение того, как маршалировать std::vector.

3 голосов
/ 10 марта 2011

Попробуйте использовать вместо

C # part

[DllImport("MyDLL.dll")]
private static extern void GetCollection(ref string[] array, uint size);

C ++ part

void GetCollection(string * array , uint size)

и заполните массив в функции GetCollection

1 голос
/ 10 марта 2011

Я бы возвратил SAFEARRAY из BSTR в C ++ и упорядочил его как массив строк в C #.Вы можете увидеть, как использовать Safearray BSTR здесь Как построить SAFEARRAY указателей на VARIANT? , или здесь http://www.roblocher.com/whitepapers/oletypes.aspx.

1 голос
/ 10 марта 2011

Я предлагаю вам изменить его на массив, а затем упорядочить. Выделение массивов в PInvoke намного проще, и на самом деле я не верю, что классы классов C ++ можно вообще маршалировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...