Можно ли передать список структур с C ++ на C # - PullRequest
0 голосов
/ 09 мая 2019

Я заинтересован в вызове фрагмента кода .NET из моего кода C ++.Код .NET разбит на отдельные dll, скомпилированные с помощью ', генерируют COM видимый ', он состоит из метода, который принимает список структуры 'item'.

Примерно так:

struct item {
  int a;
  int b;
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public interface Ifoo {
    int GetFoo(ref IntPtr items,int nItems);
}

public class foo : Ifoo {
    int GetFoo(ref IntPtr items,int nItems) 
    {
        for (int ix = 0; ix < numMatches; ix++)
        {
            it = (item)Marshal.PtrToStructure((IntPtr)((long)items + Marshal.SizeOf(typeof(item))*ix)),typeof(item));
        }
    }
}

В части c ++ у меня есть нечто похожее на это ..

std::vector<struct> foo;
foo.push_back(stru1); // stru1 is initialized anywhere...
foo.push_back(stru2); // and so on...

netInstance->GetFoo(reinterpret_cast<long*>(foo.data()),foo.size());

Но это не работает ... все, что я получаю, это исключение памяти ..

Я также пробовал другие подходы, такие как SAFEARRAY, но кажется, что он не работает с пользовательскими структурами ..

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Контролируете ли вы как часть C #, так и часть C ++? Вместо маршальных массивов измените интерфейс для работы с отдельными элементами. Отладка будет проще.

0 голосов
/ 09 мая 2019

В Windows long может быть 32-разрядным целым числом. Вы можете попробовать изменить long* на long long* в своем коде C ++, чтобы размер массива соответствовал размеру ваших данных.

...