C # делегаты против указателей на функции C - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть DLL, написанная на C, которую мне нужно использовать в моем приложении C #. Но у меня есть проблема, у меня есть интерфейс, который использует структуру снизу:

typedef struct {

int (*Func1)(void*, int*);
int (*Func2)(void*, int*);
       ...
} myStructure;

Итак, мне нужно перевести его на C #:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct myStructure
{
    public delegate int Func1(void* l,int* data);
    public delegate int Func2(void* l,int* data);
              ...
}

В C # мне нужно связать функции этой структуры с реальными методами, но я не могу этого сделать, потому что делегаты являются сильными типами, и мне нужно создать экземпляр этих делегатов, поэтому я решил немного изменить эту структуру в C #, как это:

    [StructLayout(LayoutKind.Sequential)]
public unsafe struct myStructure
{
    public delegate int func1(void* l,int* data);
    public delegate int func2(void* l,int* data);
              ...
    public func1 Func1;
    public func2 Func2;
             ...
}

Он компилируется, но приложение вылетает и выдает эту информацию отладки: получить эту ошибку: Помощник по управляемой отладке 'PInvokeStackImbalance' Вызов функции PInvoke «myApp! MyApp.Somenamespace :: MyInterface» разбалансирует стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи. Программа '[7976] myApp.exe' завершила работу с кодом -1 (0xffffffff).

Некоторые идеи, как я могу решить эту проблему?

...