2012-05-15 73 views
1

我嵌入單2.10.8到我的應用程序,並且有一定的麻煩與功能,具有mono_add_internal_callmono_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?在這個如何解決?

回答

0

DWORD是一個32位整數類型,而C#中的長整型是64位類型。

+0

謝謝,但將類型更改爲int不會影響任何內容 – ILya

相關問題