当前位置: 首页 > 编程语言 > C#

通过Interop-pinvoke传递C#回调函数Share

时间:2023-04-11 02:41:51 C#

通过Interop/pinvoke传递C#回调函数我使用了大约10种不同的函数。现在我不知道如何处理将回调作为参数传递,以便DLL可以调用我的代码。这是DLL的函数原型:typedefvoid(WINAPI*lpfnFunc)(constchar*arg1,constchar*arg2)并允许我传递上述类型的函数:intWINAPISetFunc(lpfnFuncf)这是C#委托和函数定义代码:publicdelegatevoidFunc(stringarg1,stringarg2);publicstaticvoidMyFunc(stringarg1,stringarg2)这是我的SetFuncInterop函数的C#代码:[DllImport("lib.dll",CharSet=CharSet.Ansi)]publicstaticexternintSetFunc(Funclpfn);最后是调用SetFunc函数并将其传递给我的回调的代码:SetFunc(newFunc(MyFunc));不幸的是,我的函数应该被调用。SetFunc函数的返回值是一个返回成功的错误代码,所以它要么没有调用我的函数,要么因为我的代码错误而无法正常工作。这对我有用:Calc.h(Calc.dll,C++):extern"C"__declspec(dllexport)doubleCalc(doublex,doubley,double__stdcallp(double,double));Calc.cpp(Calc.dll,C++):#include"calc.h"__declspec(dllimport)doubleCalc(doublex,doubley,double__stdcallp(double,double)){doubles=p(x*x,y*y);返回x*y+s;}Program.cs(Sample.exe,C#):classProgram{delegatedoubleMyCallback(doublex,doubley);[DllImport("Calc.dll",CallingConvention=CallingConvention.Cdecl)]staticexterndoubleCalc(doublex,doubley,[MarshalAs(UnmanagedType.FunctionPtr)]??MyCallbackfunc);staticvoidMain(string[]args){doublez=Calc(1,2,(x,y)=>45);您可以尝试将Func委托更改为publicdelegatevoidFunc([In,MarshalAs(UnmanagedType.LPStr)]stringarg1,[In,MarshalAs(UnmanagedType.LPStr)]stringarg2);同SetFunc方法以上是C#学习教程:通过Interop/pinvoke传递C#回调函数,分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——[DllImport("lib",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Winapi)]publicstaticexternintSetFunc(Funclpfn);