gpt4 book ai didi

c# - 从非托管进程卸载 .NET DLL

转载 作者:IT王子 更新时间:2023-10-29 04:31:38 26 4
gpt4 key购买 nike

我正在使用我可以在托管 DLL 中用 C# 实现的最佳代码来扩展我的 Inno-Setup 脚本。我已经知道如何将托管 DLL 中的方法导出为非托管进程中使用的函数。它可以通过 IL 编织来完成,并且有一些工具可以自动执行此操作:

所以在导出之后,我可以在 Inno-Setup 安装程序中从 Pascal 脚本调用我的函数。但随之而来的一个问题是:DLL 似乎无法再卸载了。使用 Inno-Setup 的 UnloadDLL(...) 没有任何效果,文件保持锁定状态直到安装程序退出。因此,安装程序等待 2 秒,然后无法从临时目录(或安装目录)中删除我的 DLL 文件。事实上,它真的会一直留在那里,直到有人清理驱动器。

我知道无法再从 AppDomain 卸载托管程序集,除非关闭整个 AppDomain(进程退出)。但这对非托管主机进程意味着什么?

有没有更好的方法让Inno-Setup在加载和使用后卸载或删除我的DLL文件?

最佳答案

如其他答案中所建议的,您可以在安装结束时启动一个单独的进程,在安装过程完成后负责清理。

一个简单的解决方案是创建一个临时批处理文件,该文件循环直到可以删除 DLL 文件,然后还删除(现在为空的)临时文件夹及其本身。

procedure DeinitializeSetup();
var
FilePath: string;
BatchPath: string;
S: TArrayOfString;
ResultCode: Integer;
begin
FilePath := ExpandConstant('{tmp}\MyAssembly.dll');
if not FileExists(FilePath) then
begin
Log(Format('File %s does not exist', [FilePath]));
end
else
begin
BatchPath :=
ExpandConstant('{%TEMP}\') +
'delete_' + ExtractFileName(ExpandConstant('{tmp}')) + '.bat';
SetArrayLength(S, 7);
S[0] := ':loop';
S[1] := 'del "' + FilePath + '"';
S[2] := 'if not exist "' + FilePath + '" goto end';
S[3] := 'goto loop';
S[4] := ':end';
S[5] := 'rd "' + ExpandConstant('{tmp}') + '"';
S[6] := 'del "' + BatchPath + '"';
if not SaveStringsToFile(BatchPath, S, False) then
begin
Log(Format('Error creating batch file %s to delete %s', [BatchPath, FilePath]));
end
else
if not Exec(BatchPath, '', '', SW_HIDE, ewNoWait, ResultCode) then
begin
Log(Format('Error executing batch file %s to delete %s', [BatchPath, FilePath]));
end
else
begin
Log(Format('Executed batch file %s to delete %s', [BatchPath, FilePath]));
end;
end;
end;

关于c# - 从非托管进程卸载 .NET DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com