Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
438 views
in Technique[技术] by (71.8m points)

Passing a C# callback function through Interop/pinvoke

I am writing a C# application which uses Interop services to access functions in a native C++ DLL. I am already using about 10 different functions which are working.

Now I am not sure how to handle passing a callback as a parameter so that the DLL can call my code.

Here is the function prototype of the DLL:

typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2)

And the function that allows me to pass the above type:

int WINAPI SetFunc(lpfnFunc f)

Here is my C# code for the delegate and function definitions:

public delegate void Func(string arg1, string arg2);

public static void MyFunc(string arg1, string arg2)

Here is my C# code for the SetFunc Interop function:

[DllImport("lib.dll", CharSet = CharSet.Ansi)]
public static extern int SetFunc(Func lpfn);

And finally here is the code where I call the SetFunc function and pass it my callback:

SetFunc(new Func(MyFunc));

Unfortunately my function is not being called when it should be. The return value of the SetFunc function is returning the error code for a Success, so either it's not calling my function or it's not working because my code is wrong.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This works for me:

Calc.h (Calc.dll, C++):

extern "C" __declspec(dllexport) double Calc(double x, double y, double __stdcall p(double, double));

Calc.cpp (Calc.dll, C++):

#include "calc.h"

__declspec(dllimport) double Calc(double x, double y, double __stdcall p(double, double))
{
    double s = p(x*x, y*y);
    return x * y + s;
}

Program.cs (Sample.exe, C#):

class Program
{
    delegate double MyCallback(double x, double y);
    [DllImport("Calc.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern double Calc(double x, double y, [MarshalAs(UnmanagedType.FunctionPtr)]MyCallback func);

    static void Main(string[] args)
    {
        double z = Calc(1, 2, (x, y) => 45);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...