Declare your function pointer as typedef void (*FuncPtr)(int i);
Rossj wrote:
PhrostByte wrote: Probably not, but the exception is still being thrown Anyone have a solution?
I wrote a simple bit of code to replicate this and it works, or rather I can replicate either of the two problems you mentioned. Without the GCHandle a NPE is thrown in the dllimport'ed function that calls the delegate from C (after it has actually done the callback), and with the handle I get ArgumentException thrown about non-blittable types.
Please forgive the ugly code ..
C code wrote:
#include <windows.h>
typedef void FuncPtr( int i );
FuncPtr *cb;
__declspec( dllexport )
void SetCallback( FuncPtr ptr )
{
cb = &ptr;
}
__declspec( dllexport )
void SomeFunc()
{
if ( *cb ) {
*cb( 10 );
}
}
C# wrote:
class Class1
{
public delegate void MyDelegate( int i );
MyDelegate deleg;
// GCHandle handle;
public Class1()
{
deleg = new MyDelegate( SomeCallback );
// handle = GCHandle.Alloc( deleg, GCHandleType.Pinned );
SetCallback( deleg );
}
// Calls into native code to fire the callback
public void WorkerMethod()
{
SomeFunc();
}
public void Close()
{
// handle.Free();
}
[DllImport("nativecode.dll")]
public static extern void SetCallback( MyDelegate d );
[DllImport("nativecode.dll")]
public static extern void SomeFunc();
public static void SomeCallback( int i )
{
Console.WriteLine( "Callback " + i.ToString() );
}
[STAThread]
static void Main(string[] args)
{
Class1 c = new Class1();
c.WorkerMethod();
c.Close();
}
}