C#学习教程:从非托管进程中卸载.NETDLL我已经知道如何将托管DLL中的方法导出为非托管进程中使用的函数。它可以通过IL编织来完成,并且有一些工具可以使其自动化:因此,在导出之后,我可以从Inno-Setup安装程序中的Pascal脚本调用我的函数。但是有一个问题:DLL好像没有被卸载了。使用Inno-Setup的UnloadDLL(...)无效,文件将保持锁定状态直到安装程序退出。所以安装程序等待2秒,然后无法从临时目录(或安装目录)中删除我的DLL文件。事实上,它一直在那里,直到有人清理了驱动器。我知道除非关闭整个AppDomain(进程退出),否则无法再从AppDomain卸载托管程序集。但这对于非托管主机进程意味着什么?有没有更好的方法让Inno-Setup在加载和使用后卸载或删除我的DLL文件?正如其他答案中所建议的,您可以在安装结束时启动一个单独的进程,该进程将在安装过程完成后进行清理。一个简单的解决方案是创建一个特殊的批处理文件,循环直到可以删除DLL文件,然后还删除(现在是空的)临时文件夹及其本身。过程取消初始化设置();变量文件路径:字符串;批处理路径:字符串;S:TArrayOfString;结果代码:整数;beginFilePath:=ExpandConstant('{tmp}MyAssembly.dll');如果不是FileExists(FilePath)然后开始Log(Format('File%sdoesnotexist',[FilePath]));结束否则开始BatchPath:=ExpandConstant('{%TEMP}')+'delete_'+ExtractFileName(ExpandConstant('{tmp}'))+'.bat';SetArrayLength(S,7);S[0]:=':loop';S[1]:='del"'+文件路径+'"';S[2]:='如果不存在"'+FilePath+'"gotoend';S[3]:='转到循环';S[4]:=':结束';S[5]:='rd"'+ExpandConstant('{tmp}')+'"';S[6]:='del"'+BatchPath+'"';如果不是SaveStringsToFile(BatchPath,S,False)然后开始Log(Format('Errorcreatingbatchfile%stodelete%s',[BatchPath,FilePath]));结束elseifnotExec(BatchPath,'','',SW_HIDE,ewNoWait,ResultCode)thenbeginLog(Format('Errorexecutingbatchfile%stodelete%s',[BatchPath,FilePath]));结束否则开始日志(格式('执行编辑批处理文件%s以删除%s',[BatchPath,FilePath]));结尾;结尾;结尾;可以添加一个批处理脚本(以runcmd-c的形式),在设置结束时执行,等待文件可以被删除并删除它(只需确保inno选项设置为不等待cmd进程完成)您还可以在首次执行时检测并删除已安装的程序。如本代码项目文章所述:https://www.codeproject.com/kb/threads/howtodeletecurrentprocess.aspx使用如下参数调用cmd。Process.Start("cmd.exe","/Cping1.1.1.1-n1-w3000>Nul&Del"+Application.ExecutablePath);但基本上就像@Sean建议的那样,确保你不要等待脚本中的cmd.exe退出。虽然不能完全回答您的问题,但您不能在下次重新启动计算机时将DLL标记为删除吗?做你想做的事情的简单方法是通过AppDomain。您可以卸载AppDomain,而不是初始AppDomain。所以解决办法是新建一个AppDomain,在里面加载托管DLL,然后卸载AppDomain。AppDomainad=AppDomain.CreateDomain("隔离DLL");程序集a=ad.Load(newAssemblyName("MyManagedDll"));objectd=a.CreateInstance("MyManagedDll.MyManagedClass");输入t=d.GetType();doubleresult=(double)t.InvokeMember("Calculate",BindingFlags.InvokeMethod,null,d,newobject[]{1.0,2.0});AppDomain.Unload(广告);DLL代码是这样的...以上是C#学习教程:Unloading.NETDLLfromanunmanagedprocess分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注—namespaceMyManagedDll{publicclassMyManagedClass{publicdoubleCalculate(doublea,doubleb){returna+b;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
