Windows 8 MSI可以';使用Windows 8与Windows 7构建时,请不要注册DLL

Windows 8 MSI可以';使用Windows 8与Windows 7构建时,请不要注册DLL,windows-8,windows-7,windows-installer,dllregistration,Windows 8,Windows 7,Windows Installer,Dllregistration,我正在使用VisualStudio2010构建一个MSI,它由几个DLL文件组成,这些文件设置为使用vsdrpCOMSelfReg注册。还有几个Windows服务是使用自定义操作安装的。我的目标计算机运行的是Windows 32位嵌入式标准 我以前的开发箱运行的是64位Windows 7,我可以毫无问题地构建和安装这个MSI。我最近改为Windows 8 Pro,当我使用完全相同的代码库构建MSI时,我的DLL上出现“注册失败”错误,这会导致服务安装失败 我在MSI中有一个“特权”启动条件,它适

我正在使用VisualStudio2010构建一个MSI,它由几个DLL文件组成,这些文件设置为使用vsdrpCOMSelfReg注册。还有几个Windows服务是使用自定义操作安装的。我的目标计算机运行的是Windows 32位嵌入式标准

我以前的开发箱运行的是64位Windows 7,我可以毫无问题地构建和安装这个MSI。我最近改为Windows 8 Pro,当我使用完全相同的代码库构建MSI时,我的DLL上出现“注册失败”错误,这会导致服务安装失败

我在MSI中有一个“特权”启动条件,它适用于两个版本,因此看起来需要的权限就在那里

如果我将DLL文件设置为“vsdrpCOM”,我可以在事后使用regsvr32成功注册,但我的服务无法安装,因为它们依赖于正在注册的DLL来完成自己的安装


我错过了什么?Windows 7和Windows 8之间的DLL注册表发生了什么变化?

造成这种情况的常见原因是缺少依赖项。ComSelfReg要求在安装过程中加载并运行DLL。如果您已经将VC++运行时支持作为合并模块包括在内,并且它们安装在WinSxS中,那么它们在需要运行selfreg代码之前不可用。这些症状与从合并模块安装VC++运行时时得到的症状完全相同,并且系统上不存在这些症状-安装过程中失败,安装后使用regsvr32成功


一般来说,您应该考虑使用不需要代码就能安装服务的工具。所有主要的安装工具都会填充MSI文件中的ServiceInstall和ServiceControl表,因为MSI可以很好地安装服务,但是VS安装程序出于某种原因不使用它们

问题在于我添加DLL项目输出时自动拉入的依赖项。检测到的依赖项之一是从C:\Windows\System32中提取的iphlapi.DLL。然后将此DLL复制到应用程序目录中。在我安装的Windows 8 Pro中,iphlapi.DLL的版本是6.2.9200.16420。在Windows 7中,此文件的版本为6.1.7600.16385


我猜我的程序集引用的是Windows 8版本,因为它位于本地目录中,这会导致注册和/或运行时错误。我从安装程序中排除了iphlapi.DLL,现在一切都正常运行,引用了System32中的文件。

谢谢您的回答,我以后将避免使用ComSelfReg。就我而言,这不是问题所在,但我很欣赏最佳实践建议。