使用回调从InnoSetup调用C#DLL我有一个正在运行的InnoSetup脚本,我在其中使用SherlockSoftware的innocallback.dll。此DLL包装了我的一个过程,以便它可以传递给C#DLL。我不想使用这个DLL,我想直接调用我导出的C#方法并将回调过程传递给它。我的问题是:如何将我的Inno设置(@mycallback)传递给我的C#DLL,以便我可以将它用作我的委托/UnmanagedFunctionPointer?正如我所说,这段代码有效,但我想尽可能少地使用外部DLL。这是我的代码:Inno安装脚本类型TTimerProc=procedure();TProgressCallback=程序(进度:整数);functionWrapProgressProc(callback:TProgressCallback;paramcount:integer):longword;外部'wrapcallback@files:innocallback.dllstdcall';函数测试(回调:长字):字符串;外部'Test@files:ExposeTestLibrary.dllstdcall';varendProgram:布尔值;程序mycallback(进度:整数);开始MsgBox(IntToStr(进度),mbInformation,MB_OK);如果进度>15然后开始endProgram:=True;结束结束;函数InitializeSetup:布尔值;varprogCallBack:长字;回调:长字;味精:长字;msg2:宽字符串;开始结束程序:=假;progCallBack:=WrapProgressProc(@mycallback,1);//我们的proc有1个参数Test(progCallBack);结果:=真;结尾;这是我的C#代码公共静态ReportProg按下m_reportProgess;静态uintm_iProgress;[DllExport("Test",CallingConvention=CallingConvention.StdCall)]staticintTest(ReportProgressrProg){m_iProgress=0;m_reportProgess=rProg;System.Timers.TimerpTimer=newSystem.Timers.Timer();pTimer.Elapsed+=aTimer_Elapsed;pTimer.Interval=1000;pTimer.Enabled=true;GC.KeepAlive(pTimer);返回0;m_reportProgess(m_iProgress);由于您根本无法使用您选择的调用约定在InnoSetup中定义回调过程,也无法使用寄存器调用约定(特定于Delphi编译器的约束),因此无法放弃包装InnoCallback库使用在您的C#库。由于此限制,您必须使用外部库将InnoSetup的回调方法包装到具有库可以使用的调用约定的函数中(InnoCallback使用stdcall)。因此,如果您使用支持Delphi寄存器调用约定的语言编写您的库,那么您所要求的是可能的。出于好奇,您可以在Delphi中编写例如:libraryMyLib;类型TMyCallback=procedure(IntParam:Integer;StrParam:WideString)ofobject;程序CallMeBack(回调:TMyCallback);标准调用;开始回调(123,'你好!');结尾;导出CallMeBack;开始结束。然后在InnoSetup中(没有任何封装库):以上是C#学习教程:使用回调从InnoSetup中调用C#DLL。了解更多C#学习教程,希望大家多多关注——[Setup]AppName=MyProgramAppVersion=1.5DefaultDirName={pf}MyProgram[Files]Source:"MyLib.dll";标志:dontcopy[Code]typeTMyCallback=procedure(IntParam:Integer;StrParam:WideString);程序CallMeBack(回调:TMyCallback);外部'CallMeBack@files:mylib.dllstdcall';程序MyCallback(IntParam:整数;StrParam:WideString);beginMsgBox(Format('IntParam:%d;StrParam:%s',[IntParam,StrParam]),mbInformation,MB_OK);结尾;程序初始化向导;开始CallMeBack(@MyCallback);结尾;联系右侧管理员删除。如需转载请注明出处:
