Помогите Маршалинг функции C в C # - PullRequest
2 голосов
/ 08 февраля 2011


Я пытаюсь вызвать функцию C из C #.
Вот функция из файла заголовка C:

int __stdcall GetImageKN (unsigned short *ndat );

И из документации об этой функции:

ndat:
Указатель буфера получения данных изображения в градациях серого.
Всегда защищайте область хранения изображения диапазона с помощью прикладной программы.
Размер области хранения данных изображения диапазона должен быть:
160 '120' 2 = 38400 байт
Оттенки серого возвращаются как 8-битные, что удваивается от 7-битных.

Как вызвать эту функцию и прочитать данные изображения?
Спасибо,
SW

Ответы [ 4 ]

2 голосов
/ 08 февраля 2011

30Kb - это небольшой буфер. Если ваша функция работает быстро, вы можете положиться на поведение маршалинга по умолчанию и сделать это:

[DllImport ("your.dll")]
extern int GetImageKN (short[] ndat) ;

var buffer = new short[160 * 120] ;
var result = GetImageKN (buffer)  ;

Даже если он может блокироваться в течение длительного времени, вы можете обойтись без этого, если не вызываете эту функцию сразу для нескольких потоков.

1 голос
/ 08 февраля 2011

Я бы попробовал следующее:

[DllImportAttribute("your.dll", CallingConvention=CallingConvention.StdCall)]
extern int GetImageKN(
    [Out, MarshalAs(UnmanagedType.LPArray, SizeConst=38400)] ushort[] ndat);

Не совсем уверен, однако.

1 голос
/ 08 февраля 2011
[DllImport ("your.dll")]
extern int GetImageKN (IntPtr ndat);

вероятно сделает ...

EDIT

обычно указатели представляются как IntPtr. Вы можете создать управляемый массив и перенести его в IntPtr,

0 голосов
/ 08 февраля 2011
ushort ndat= 123;

GetImageKN(ref ndat);
...