【发布时间】:2015-01-27 14:14:27
【问题描述】:
我有一个 InnoSetup,我在其中加载了一个 C# DLL。安装程序在安装结束时挂断。 我在 stackoverflow 上找到了一个线程,其中似乎有一些很好的信息,但我没有经验来获取提供的信息......
InnoSetup hangs after install due to dll
我的 DLL 所做的基本上是:
- 在某些线程中解压 *.zip 文件
- 通过回调向 innoSetup 提供反馈。
Inno 发生了什么:
- 启动导出的 DLL 方法
- 接收回调
- 解压完成后卸载 DLL。
但似乎永远不会卸载 DLL。 我通过每 5 秒触发一次的 TimerEvent 对其进行了测试,并且计时器永远不会停止。
这是一个代码sn-p: 英诺:
type
TProgressCallback=procedure(progress:Integer); // ; id : String
function WrapProgressProc(callback:TProgressCallback; paramcount:integer):longword;
external 'wrapcallback@files:innocallback.dll stdcall';
function ReadZipEx(xml:String; callback:longword): longword;
external 'ReadZipEx@{src}\data\tools\ZipLib.dll stdcall loadwithalteredsearchpath';
procedure InstallData();
var
progCallBack : longword;
begin
progCallBack := WrapProgressProc(@ProgressCallback,1);
//create xml
ReadZipEx(m_XML_String,progCallBack);
end;
procedure ProgressCallback(progress:Integer); //;id : String
begin
pbStateZip.position := progress;
lblState1.Caption := IntToStr(progress);
if(progress = 100)then begin
UnloadDLL(ExpandConstant('{src}\data\tools\ZipLib.dll'));
UnloadDLL(ExpandConstant('{tmp}\innocallback.dll'));
OperationsFinished();
end
end;
C#:
[DllExport("ReadZipEx", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static int ReadZipEx(string xml, ReportProgress repoProg)
{
//start threads
//start timers which fire the callback
}
有谁知道为什么我的设置最终会冻结以及为什么 DLL 永远不会被卸载或为什么它会继续运行?我试图释放 C# 部分使用的所有数据
【问题讨论】:
标签: c# dll callback inno-setup