1
我嵌入單2.10.8到我的應用程序,並且有一定的麻煩與功能,具有mono_add_internal_call
mono_delegate_to_ftnptr:函數調用掛起
註冊比方說,我已成功方法:
internal delegate void Win32ServiceHandler(long statusCode);
internal static class Win32Service
{
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void Test(Win32ServiceHandler handler);
}
它的非託管的定義:
void icall_TestDelegateCallback(MonoDelegate *ftn) {
LPHANDLER_FUNCTION f = (LPHANDLER_FUNCTION)mono_delegate_to_ftnptr(ftn);
f(SERVICE_CONTROL_STOP);
}
和一些代碼來測試:
protected virtual void ServiceHandler(Win32ServiceControl statusCode)
{
Console.WriteLine("here");
}
public void MakeTest()
{
Console.WriteLine("before");
Win32Service.Test(this.ServiceHandlerInternal);
Console.WriteLine("after");
}
我從控制檯應用程序運行它,當我打電話MAKETEST(),輸出爲:
before
here
和應用不會再回來。
其實它是一個簡化的示例。在真正的程序中,我需要將函數指針作爲回調傳遞給RegisterServiceCtrlHandler
,所以像mono_runtime_invoke
(即btw工作正常)等東西不是我所需要的。
問題是調用從MonoDelegate獲得的函數指針的正確方法是什麼?還是以任何其他正確的方式將其作爲回調傳遞給它?
我的平臺是Windows 7 64位系統
UPD:
有趣的發現。一旦我我的代碼更改爲:
internal static class Win32Service
{
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void Test(Action handler);
}
和
typedef VOID (*TESTFTN)();
void icall_TestDelegateCallback(MonoDelegate *ftn) {
TESTFTN f = (TESTFTN)mono_delegate_to_ftnptr(ftn);
f();
}
和:
public void MakeTest()
{
Console.WriteLine("before");
Win32Service.Test(() => Console.WriteLine("here"));
Console.WriteLine("after");
}
Everithing的偉大工程。所以問題是在編制冗長的DWORD?在這個如何解決?
謝謝,但將類型更改爲int不會影響任何內容 – ILya