Вызов неуправляемого кода C ++ в C #, смешанного с STL - PullRequest
2 голосов
/ 07 апреля 2010

Эй, я хочу вызвать неуправляемый код на C ++ в C #. Интерфейс функции подобен следующему (я упростил его, чтобы его было легче понять)

struct Face{
    vector<float> nodes;
    vector<int>  indexs;
}

Я гуглил и читал документы MSDN, нашел способы вызова простого неуправляемого кода на c / c ++ в C #, также знаю, как передать структуру в качестве возвращаемого значения.И мой вопрос в том, как обращаться с «вектором».Я не нашел правил сопоставления между вектором и некоторыми типами в C #

Спасибо!

Ответы [ 3 ]

1 голос
/ 07 апреля 2010

Вы хотите, если возможно, избегать использования STL ни в чем, кроме чистого неуправляемого кода. Когда вы смешиваете его с C ++ / CLI (или Managed C ++), вы, скорее всего, получите код STL, работающий как управляемый, и код клиента, работающий как неуправляемый. Что происходит, когда вы, скажем, выполняете итерацию по вектору, каждый вызов метода вектора переходит в управляемый код и возвращается обратно.

См. здесь для аналогичного вопроса.

0 голосов
/ 07 апреля 2010

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

#pragma pack(push, 8)
struct ReflSettings
 {
double* Q;
    double* DisplayQ;
 }
 #pragma pack(pop)

тогда ваша структура C # будет

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
    public class ModelSettings:IDisposable
    {

        [XmlIgnore] internal IntPtr Q;
        [XmlIgnore] internal IntPtr DisplayQ;
    }

Надеюсь, это поможет.

0 голосов
/ 07 апреля 2010

Вероятно, самое простое, что нужно сделать, - это создать управляемый класс в C ++ для представления структуры Face и скопировать его содержимое в новый управляемый класс.После этого ваш код c # должен понимать данные.

Вместо векторов можно использовать ArrayList .

...