2010-11-18 2 views
1

Я просто хочу вызвать функцию C из DLL в C#. Эта функция C возвращает структуру.вызывать функцию C со структурой как возвращаемое значение в C#

Здесь .h-файл декларация библиотека C:

typedef struct t_Point{ 
int x; 
int y; 
} Point; 


Point myFuncs(); 

Теперь я хочу, чтобы использовать эту функцию в C#. Wrapper.cs:

using System.Text; 
using System.Runtime.InteropServices; 

namespace CSharp_mit_OpenCV 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct Point 
    { 
     public int x; 
     public int y; 
    }; 

    class Wrapper 
    { 
     [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)] 
     [return: MarshalAs(UnmanagedType.Struct)] 
     public static extern Point myFuncs(); 
    } 
} 

Использование выглядит следующим образом:

Point p = Wrapper.myFuncs(); 

(именование, вероятно, не лучший)

myFuncs объявляет только на структуру, ставит некоторые значения х и у и возвращает его. Проблема: значения, которые я получаю на C#, отличаются от значений, сгенерированных в функции C. Это должно быть 4 и 2, и это 0 и 111226272. В чем проблема?

Спасибо за помощь!

+0

Угадайте, что это что-то с различиями в типах: попробуйте C# 'short' вместо' int' и попробуйте с 'uint' или' ushort'. Можете ли вы опубликовать байты, выводимые процессом (так, прежде чем C# попытается создать структуру из них)? –

+1

Всегда ли он возвращается 111226272 или число меняется каждый раз? –

+0

Не забудьте убедиться, что соглашение о вызове верное (cdecl/fast-call и т. Д.). См. Здесь: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx – plinth

ответ

0

Ваш код маршалла кажется правильным, что такое макет пакета неуправляемого метода? LayoutKind.Sequential будет обрабатывать ваши int как 4 байта. Проверьте, правильно ли это.

Смежные вопросы