繁体   English   中英

MSI设置自动复制Shell32.dll,导致问题

[英]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.dllInterop.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM