Я предполагаю, что у вас есть правильные подписи для всего, что вы делаете через p / Invoke.Если вы этого не сделаете, то вам нужно сначала исправить это.
Согласно этой статье , возможно, у вас возникла проблема с сборкой мусора вашего делегата.
Они используют GCHandle.Alloc
на делегате, чтобы создать ссылку, которая не будет собирать мусор.
static void DemonstrateCallBack_With_GCHandle()
{
var callback_delegate = new CallBack(CallBackFunction);
GCHandle gch = GCHandle.Alloc(callback_delegate);
IntPtr intptr_delegate =
Marshal.GetFunctionPointerForDelegate(callback_delegate);
PerformActionWithCallBack(intptr_delegate);
gch.Free();
}
Если это сработает для вас, я бы посоветовал вам обернуть GCHandle.Alloc
и gch.Free
в объекте, который реализует IDisposable
и, возможно, рассмотрит использование SafeHandle
.
В этой статье могут быть приведены некоторые соответствующие подробности: http://obiwanjacobi.blogspot.com/2007/05/robust-pinvoke-for-windows-midi-api.html