2010-02-17 68 views
3

我使用C代碼調用了非託管函數。 pCallback是一個函數指針,所以託管端是一個委託。調用回調函數時出現C#異常

[DllImport("MyDLL.dll")] 

public static extern Result SetCallback(
      IntPtr handle, 
      Delegate pCallback, 
      CallbackType Type); 

現在我設置

private delegate void pfnCallback(uint PromptID, ttsEventType evt, IntPtr lData); 
private pfnCallback cb = new pfnCallback(cback); 

public Form1() 
{ 

    (...) 
    Wrapper.SetCallback(handle, cb, IntPtr.Zero, CallBackType.DEFAULT); 
    (...) 
    public static void cback(uint PromptID, ttsEventType evt, IntPtr lData) 
    { } 
    } 

調試時,我看到它運行cback功能一次,然後我得到一個異常沒有數據,只是說「發生未處理的win32異常WindowsApp2.vshost.exe [4372]我不明白什麼是錯的。誰能幫我?

回答

1

嘗試使用

[UnmanagedFunctionPointer(CallingConvention.xxx, CharSet = CharSet.xxx)] 
public delegate ... 
+0

它的工作!非常感謝你! – jose 2010-02-17 16:18:01

1

您必須確保垃圾收集器未收集您對回調的引用。只要回調預計是呼叫,對回調的引用必須在託管內存中保持活動狀態。

一去解決這個辦法是在中間

2

創建一個託管C++層沒有很多的細節在這裏,但我的猜測是,這可能是一個調用約定的問題。我總是嘗試在使用DllImport時明確設置調用約定;

[DllImport("msvcrt.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)] 
public static extern int printf(String format, int i, double d); 

調用約定可能會影響參數放置在調用堆棧上以及之後如何清理它們。

here

你不得不找到提供非託管庫的標題或文檔正確的約定。

相關問題