[英]MSI setup auto copying Shell32.dll, causing problems
该应用程序需要使用COM参考Microsoft Shell Control And Automation
,它位于C:\\Windows\\system32\\shell32.dll
但在添加其引用之后,VS 2010在目标构建目录中添加了一个dll Interop.Shell32.DLL
。 一切正常。 但是在构建MSI安装向导项目时。 它添加了shell32.dll
作为依赖。 好吧,没问题。
但是在安装时,它还会将shell32.dll
与Interop.Shell32.DLL
一起复制到目标安装目录中,现在应用程序运行时会显示奇怪的错误。 但是如果我从安装目录手动删除shell32
,一切正常。
为什么MSI在安装目录中复制shell32.dll
? 是否需要64位操作系统? 如果是,为什么选择Interop.Shell32.DLL
? 对于我的应用程序, shell32.dll
似乎有问题,有没有办法可以避免它被复制?
编辑:
我从安装项目中排除了shell32.dll
,它会在64位操作系统中出现问题吗?
Edit2: C:\\Windows\\system32\\
shell32.dll
实际上是5KB,但是MSI复制了11 MB。 它是什么 ?
您肯定必须阻止安装程序复制shell32.dll。 它是Windows中始终包含的关键操作系统DLL。 拥有错误版本的shell32.dll是一个相当致命的问题。 Windows中内置的文件系统保护功能将阻止它覆盖c:\\ windows \\ system32中的文件系统保护功能,但是无法阻止本地副本破坏您的程序。 是的,它是几兆字节,它看起来只是安装在c:\\ windows \\ system32。 这实际上是真实位置的硬链接,它存储在c:\\ windows \\ winsxs中。 system32中的大多数文件实际上都是硬链接,否则是一种简单的机制,可以防止不良安装程序破坏操作系统。
Interop.Shell32.dll程序集是一个由Tlbimp.exe生成的互操作程序集。 它只包含带有[ComImport]指令的声明,从shell32.dll中的类型库中检索到的声明,并转换为等效的.NET声明。 使CLR很容易实现RCW而无需读取类型库本身。 你必须部署互操作程序集。
不知道这里出了什么问题,安装程序创建者实用程序自动也为interop程序集复制本机DLL当然是不正常的。 但是你必须进行干预并阻止它这样做。
您可以添加引用,然后设置此引用的属性
将copy local设置为False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.