Судя по названию функции в вашем VB-коде, это функция C ++ и экспортируется как таковая. Следовательно, он не использует соглашение о вызовах "stdcall" (которое P / Invoke предполагает по умолчанию), а "thiscall" (которое VC ++ использует для всех не vararg функций C ++). Итак, попробуйте это:
<DllImport("TiNG.dll", CallingConvention := CallingConvention.ThisCall)> _
Private Shared Function sm_switch_channel_input_iPsCtiie1_3__ ...
Более подходящий способ исправить это - украсить функцию в коде C вместо extern "C"
и __stdcall
:
extern "C" {
int __stdcall sm_switch_channel_input(struct sm_switch_channel_parms *switchp)
...
}
Тогда ваше оригинальное объявление P / Invoke должно работать как есть.
В качестве примечания, все ваши атрибуты MarshalAs
являются избыточными (они задают поведение, которое уже является типом по умолчанию для типов, к которым вы его применяете), поэтому вы можете полностью их удалить.