Передача указателей при вызове кода C из C#C#

Место общения программистов C#
Ответить
Anonymous
 Передача указателей при вызове кода C из C#

Сообщение Anonymous »

У меня есть код C, который я хочу вызвать из C#.
Нет необходимости раскрывать структуры данных C C#, поэтому C# может просто передавать на них указатели.
Основная идея заключается в том, чтобы заставить C# решить, что делать, приказать C сделать это, а затем сообщить о результатах - C# не обязательно много знать о том, что делает C.
Например, в C у меня есть
__declspec(dllexport) long cs_getB() {
return &B;
}

__declspec(dllexport) int cs_order(long csa) {
c_struct a = (c_struct *)csa;
return order(a);
}

int order(c_struct a)
{
// implementation
return 0;
}


а затем я делаю это на C#
[DllImport("C:\\whatever.dll", EntryPoint = "cs_getB", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetB();

[DllImport("C:\\whatever.dll", EntryPoint = "cs_order", CallingConvention = CallingConvention.StdCall)]
public static extern int Order(IntPtr a);


и
IntPtr b = MyDll.GetB()
int bor = MyDll.Order(b);

но вызов MyDll.Order выдает

System.AccessViolationException: 'Попытка прочитать или защищенная от записи память. Это часто указывает на то, что другая память повреждена.'

Правильен ли этот подход?
Как я могу заставить C# обрабатывать (указатели на ) данные из C и сообщить C, что с ними делать?
Обновить
То же самое, используя long long и intptr_t в C.
Значение типа IntPtr, возвращаемое в C#, равно 0x00007ffef6de8750.
VisualStudio не будет входить в код C.
__declspec(dllexport) intptr_t getB() {
return &B;
}

где
struct thingy {
long* m729;
...
};
typedef struct thingy* thing;
thing B;


Подробнее здесь: https://stackoverflow.com/questions/791 ... om-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»