2014-07-16 90 views
2

我有一些非託管的C++動態庫和C#GUI應用程序,使用它。我想通過某些庫提供的方法中的參數傳遞迴調。是否有可能將回調傳遞給C#中的非託管C++方法。從C#傳遞迴調參數到非託管C++

// unmanaged C++ 
typedef uint8_t (__stdcall *SomeCallback)(); 

MYDLL_API uint8_t someMethod(SomeCallback cb); 

我想以這種方式來使用庫:

// C# part 
public delegate Byte SomeDelegate(); 

[DllImport("mylibraryname.dll")] 
public static extern Byte someMethod(ref SomeDelegate pDelegate); 

// actuak callback 
Byte myCallback() { 
    // some code 
} 

... 

// call unmanaged passing callback 
static void Main(string[] args) {   
    someMethod(myCallback); 
} 

我收到錯誤的編譯:

cannot convert from 'method group' to 'ref SomeDelegate 

我完全錯了我的做法?

+0

爲什麼在你的extern方法中回調ref? – Dirk

回答

1

這是因爲你必須把ref修飾符放在參數之前,並強制它成爲一個變量。所以:

改變你的extern到:

public static extern Byte someMethod([MarshalAs(UnmanagedType.FunctionPtr)] 
          ref SomeDelegate pDelegate); 

和您的來電:

 SomeDelegate action = new SomeDelegate(myCallback); 
     someMethod(ref action); 

UPDATE:如果你想將參數傳遞給回調(比如一個int):

public delegate Byte SomeDelegate([MarshalAs(UnmanagedType.I4)] int value); 

[DllImport("mylibraryname.dll")] 
public static extern Byte someMethod([MarshalAs(UnmanagedType.FunctionPtr)] 
             ref SomeDelegate pDelegate); 

Byte MyMethod([MarshalAs(UnmanagedType.I4)] int value) 
{ 
    return (byte) (value & 0xFF); 
} 

,並呼籲:

SomeDelegate action = new SomeDelegate(MyMethod); 
someMethod(ref action); 
+0

如果回調有參數呢?有沒有一些特質? – vard

+0

它會正常工作。只需定義你的委託來匹配它,並在參數上放置屬性來指定非託管類型。你想讓我更新代碼嗎? – Alireza

+0

這將是偉大 – vard

相關問題