Visual Studio安装程序项目未删除DLL
本文关键字:删除 DLL 项目 程序 Studio 安装 Visual | 更新日期: 2023-09-27 17:59:44
我在Visual Studio安装项目和卸载应用程序方面遇到问题。
这是一个非常基本的安装程序,用于安装ApplicationLauncher.exe
C#.NET 4.0控制台应用程序和Application.Common.dll
(应用程序ApplicationLauncher.exe
的依赖项)。
安装成功,将exe和DLL都复制到程序文件文件夹C:'Program Files (x86)'Company'ApplicationLauncher'
中。
我的问题出现在卸载应用程序(通过MSI)时——卸载似乎成功了,但它留下了Application.Common.dll
,并且没有像我预期的那样删除它。
我已经使用ProcessExplorer来确保没有其他东西在使用DLL,在卸载过程中没有打开任何资源管理器窗口。
这是预期的功能吗?我必须创建一个自定义操作来删除这个DLL吗?或者我做错了什么?:S
我似乎能够通过重命名应用程序的解决方案和产品名称来解决这个问题,我不确定这是如何解决的,但它确实解决了。
我在这里唯一的想法是遍历到安装程序,在那里应用程序安装到不同的文件夹中,从而不对DLL应用相同的权限。。
这不是意料之中的事,不是。如果你对你的设置做了以下任何一项并安装了它,就会发生这种情况:
将文件标记为"永久"。
将文件SharedLegacyFile标记为true。
这些都是项目设置,但如果您设置其中任何一个并进行安装,它将保留下来。你可以在安装项目中取消设置它们,但为时已晚——你已经在系统上标记了该组件为永久组件或sharedlegacy。如果您使用全新的系统,如全新的虚拟机,请重置这些值(如果设置了这些值),然后重新生成MSI并进行安装/卸载,还会发生吗?
我也遇到了同样的问题。然后我尝试在Windows XP上安装和卸载我的应用程序,结果成功了。
重命名ProductCode是治标不治本。当卸载程序不删除dll时,就会出现此问题。下一次安装将再次使用dll,并且无法在卸载事件中删除它,因为其他程序仍在使用它。
这些步骤有望解决问题:
-
安装软件
-
打开CMD(具有管理员权限)并运行:
msiexec /x {ProductCode} /L*V "C:'CustomPath'FileName.log"
在设置项目上点击F4时可以找到ProductCode
-
打开日志文件,搜索如下所示的行:
Disallowing uninstallation of component: {6CEC09F6-9108-7062-A692-2BCBACEE3BD8} since another client exists Disallowing uninstallation of component: {A0A0FA84-CC0D-C5C4-1F57-169788C4482D} since another client exists Disallowing uninstallation of component: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} since another client exists
-
所有这些组件都必须手动从注册表中删除。要做到这一点,首先必须将GUID(例如{6CEC09F6-9108-7062-A692-2BCBACEE3BD8})转换为打包/压缩的GUID(例如6F90CEC6801926076A29BCCEB38D)。我找到了一个网站,在那里可以运行脚本来完成这项工作。在网站上找到以下代码,并将右侧替换为日志中的GUID。
string inStrGUID = "{6CEC09F6-9108-7062-A692-2BCBACEE3BD8}";
-
打开注册表(作为管理员)并搜索(编辑->查找…)压缩GUID(通常位于HKEY_LOCAL_MACHINE''SOFTWARE''Microsoft''Windows''CurrentVersion''Installer''UserData''s-1-5-18''Components''中)
-
删除等于压缩GUID的文件夹。文件夹中的值应该是dll的路径。
-
删除后,选择父文件夹(…''S-5-18''components)并点击编辑->发现
-
对日志文件中的所有组件重复这些步骤(4-7)。
-
删除原始文件夹中所有未卸载的文件也是一个好主意。
能防止这种情况发生吗
我不知道。这真的没那么容易复制。SO上的其他一些帖子怀疑Visual Studio中的安装/卸载选项是问题的原因,但我有不同的理论:
此错误可能是由于安装程序中InstallExecuteSequence中的RemoveExistingProducts执行得太晚,因此没有在正确的时间删除dll。这个错误已知多年,可以通过执行This来修复。如果你需要Orca的帮助,这将解释如何安装它。