проблем с pinvoke

1 отговора 96 прегледа
#1

проблем с pinvoke

Опитвам се от .NET да извикам DLL със следната функция:

struct Foo {
// only ints, shorts and bytes here
};

int FooBar(Foo **ppFoos, int *pCount);

Тя алокира памет, слага там определен брой структури Foo, връща указател към тази памет в *ppFoos, и връща броя им в *pCount.

Доколкото разбрах от RTFMSDN, няма начин това да се направи официално -
в тази посока се поддържа маршалинг или на променлив по размер масив от примитивни типове, или на фиксиран по размер масив от произволни структури, но не променлив масив от произволни структури.

В изблик на отчаяние се опитах да го прочета в масив byte[] с IntPtr и Marshal.Copy, както в един от техните примери, но пак нещо не е наред - получавам null reference exception на извикването на Marshal.Copy, когато се опитам да прочета пълния размер данни от IntPtr-то (count * sizeof);
когато чета примерно половината данни, не гърми. (И преди да сте попитали, да, sizeof-ите на структурите от двете страни на маршалинга са еднакви.)

Някаква идея? Как е морално правилно да извикам тази функция, или ще се наложи да си пиша wrapper DLL на С++, който да направи маршалинга до по-.НЕТ-дружелюбни типове?

Отговор
в отговор на Skotowydec #2

Re: проблем с pinvoke

e dobre de, a tova njama li da ti svyrshi rabota:

[линк] ????

There are 10 types of people in this world one who understand binary jokes and one who not
Отговор