C# Visual Studio安装项目未删除DLL

C# Visual Studio安装项目未删除DLL,c#,.net-4.0,console-application,setup-project,C#,.net 4.0,Console Application,Setup Project,我在Visual Studio安装项目和卸载应用程序方面遇到问题 这是一个非常基本的安装程序,安装ApplicationLauncher.exe C.NET 4.0控制台应用程序和application.Common.dll应用程序的依赖项ApplicationLauncher.exe 安装成功,将exe和DLL复制到程序文件文件夹C:\program files x86\Company\ApplicationLauncher\中 我的问题出现在通过MSI卸载应用程序时-卸载似乎成功,但它将ap

我在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

这不是预期的,不是。如果您对安装程序执行了以下任何操作并安装了它,就会发生这种情况:

将文件标记为永久

将文件SharedLegacyFile标记为true


这些是项目设置,但如果您设置其中一个并进行安装,它将保留。您可以在安装项目中取消设置它们,但那太晚了-您已经在系统上将该组件标记为永久或sharedlegacy。如果您使用全新的系统,如新的虚拟机,如果设置了这些值,请重置这些值并重新生成MSI,然后执行安装/卸载操作。是否仍然执行此操作?

这不是预期的操作,否。如果您对安装程序执行了以下任何操作并进行了安装,则会执行此操作:

将文件标记为永久

将文件SharedLegacyFile标记为true


这些是项目设置,但如果您设置其中一个并进行安装,它将保留。您可以在安装项目中取消设置它们,但那太晚了-您已经在系统上将该组件标记为永久或sharedlegacy。如果您使用一个全新的系统,比如一个新的虚拟机,如果设置了这些值,请重置这些值,然后重新构建MSI,并执行安装/卸载操作。是否仍然发生此情况?

我似乎能够通过重命名应用程序的解决方案和产品名称来解决此问题,我不确定这是如何解决的,但确实解决了


我在这里唯一的想法是,这一点贯穿到了安装程序中,应用程序安装到不同的文件夹中,因此没有对DLL应用相同的权限。

似乎我能够通过重命名应用程序的解决方案和产品名来解决此问题,我不确定这是如何解决的,但确实解决了


我在这里唯一的想法是,这一点贯穿到了安装程序中,在安装程序中,应用程序安装到了不同的文件夹中,因此没有对DLL应用相同的权限。

我也遇到了同样的问题。然后,我尝试在Windows XP上安装并卸载我的应用程序,这已经奏效。

我也遇到了同样的问题。然后,我尝试在Windows XP上安装并卸载我的应用程序,这已经奏效。

重命名产品代码是治标不治本。当卸载程序不删除dll时,就会出现问题。下一次安装将再次使用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(如6F90CEC681926076A29B2BCCAEEB38D)。我找到了一个可以运行脚本来执行此操作的方法。在网站上找到以下代码,并将右侧替换为日志中的GUID

string inStrGUID = "{6CEC09F6-9108-7062-A692-2BCBACEE3BD8}";
以管理员身份打开注册表,然后搜索编辑->查找。。。压缩GUID通常位于HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\s-1-5-18\Components中的某个位置\

删除与压缩GUID相等的文件夹。文件夹中的值应该是dll的路径

删除后,选择父文件夹…\S-1-5-18\components并点击编辑->查找

对日志文件中的所有组件重复这些步骤4-7

删除原始文件夹中所有未卸载的文件也是一个好主意

我们能阻止这种情况发生吗

我不知道。这真的不是那么容易复制。SO上的其他一些帖子怀疑Visual Studio中的安装/卸载选项是问题的原因,但我有一个不同的理论:

此错误可能是由于安装程序中InstallExecuteSequence中的RemoveExistingProducts执行得太晚,因此没有在正确的时间删除DLL
. 这个bug已经知道很多年了,可以通过执行以下操作来修复。如果您需要有关Orca的帮助,请解释如何安装它。

重命名产品代码是治标不治本。当卸载程序不删除dll时,就会出现问题。下一次安装将再次使用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(如6F90CEC681926076A29B2BCCAEEB38D)。我找到了一个可以运行脚本来执行此操作的方法。在网站上找到以下代码,并将右侧替换为日志中的GUID

string inStrGUID = "{6CEC09F6-9108-7062-A692-2BCBACEE3BD8}";
以管理员身份打开注册表,然后搜索编辑->查找。。。压缩GUID通常位于HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\s-1-5-18\Components中的某个位置\

删除与压缩GUID相等的文件夹。文件夹中的值应该是dll的路径

删除后,选择父文件夹…\S-1-5-18\components并点击编辑->查找

对日志文件中的所有组件重复这些步骤4-7

删除原始文件夹中所有未卸载的文件也是一个好主意

我们能阻止这种情况发生吗

我不知道。这真的不是那么容易复制。SO上的其他一些帖子怀疑Visual Studio中的安装/卸载选项是问题的原因,但我有一个不同的理论:


此错误可能是由于安装程序中InstallExecuteSequence中的RemoveExistingProducts执行得太晚,因此没有在正确的时间删除DLL。这个bug已经知道很多年了,可以通过执行以下操作来修复。如果您需要Orca的帮助,请解释如何安装它。

我从未将文件Permanent或SharedLegacyFile设置为true,是的,我尝试过重置值并重建MSI,但仍保留了DLL:使用msiexec/x{productcode guid在大括号中}进行卸载/l*v,可能日志会说明原因。我从未将文件Permanent或SharedLegacyFile设置为true,是的,我尝试过重置值并重建MSI,但它仍然保留了DLL:使用msiexec/x{productcode guid in braces}/l*v进行卸载,可能日志会说明原因。