Массив Маршалла в структуре C ++ в структуре C # - PullRequest
0 голосов
/ 09 марта 2011

У меня есть структура, определенная в C ++, которая содержит массивы int и std :: string, которые являются собственным кодом C ++ (dll). Я использовал следующий метод, чтобы получить его в C #:

public class PInvokeData
{
    [StructLayout(LayoutKind.Sequential)]        
    public struct pinvoke_call
    {
        //[MarshalAs(UnmanagedType.LPArray,SizeConst=5,SizeParamIndex=0,MarshalType="int")]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]//,SizeParamIndex =0,SafeArraySubType = VarEnum.VT_I4)]
        public int[] mynum;
    }
    [DllImport("DLL_pinvoke_base.dll")]
    public extern static pinvoke_call TestPInvoke();
}

код хорошо компилируется. когда я вызываю этот статический метод и получаю возвращаемое значение структуры из C ++ и присваиваю другому объекту структуры в C # как

input = PInvokeData.TestPInvoke();

я получаю исключение MarshalDirectiveException, которое не было обработано. Подпись типа метода не совместима с PInvoke. Я пытался решить проблему через другие темы форума, но я не получил результат.

структура в коде C ++ такая же, как показано для структуры C #, как

struct pinvoke_call
{
    int mynum[5]
};

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

Спасибо за ответ, Ashutosh

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

после долгого времени я отвечаю извините за это, так как я почти забыл, у меня есть решение для этого.Я возвратил указатель структуры из функции C ++ TestPInvoke (), а затем использовал IntPtr для получения этого указателя в качестве пустого указателя, а затем использовал функцию Marshal.PtrToStruct () для сопоставления его с C # struct.Спасибо за вашу поддержку, ребята ...

0 голосов
/ 09 марта 2011

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

Кроме того, CLR не поддерживает маршалинг std: strings. Вам придется написать некоторый код C ++, чтобы вернуть его более дружественным к CLR способом (например, выходной параметр LPSTR).

...