1

应用程序需要使用 COM 引用Microsoft Shell Control And Automation,它位于C:\Windows\system32\shell32.dll

但是在添加了它的引用之后,VS 2010Interop.Shell32.DLL在目标构建目录中添加了一个 dll。一切正常。但是在构建 MSI 设置向导项目时。它添加shell32.dll为依赖项。好吧,没问题。

但是在安装时,它也会复制shell32.dllInterop.Shell32.DLL目标安装目录中,现在当应用程序运行时它会显示奇怪的错误。但是,如果我从安装目录中手动删除shell32,一切正常。

为什么 MSIshell32.dll在安装目录中复制?64位操作系统需要吗?如果是,为什么Interop.Shell32.DLL?对于我的应用程序,shell32.dll似乎有问题,有没有办法可以避免它被复制?

编辑:

我从安装项目中排除shell32.dll,在 64 位操作系统中会出现问题吗?

Edit2: 实际上是 5KB,但 MSI 复制了 11 MB shell32.dllC:\Windows\system32\它是什么 ?

4

2 回答 2

2

您一定要阻止安装程序复制 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,而无需读取类型库本身。您必须部署互操作程序集。

不知道这里出了什么问题,安装程序创建实用程序自动复制互操作程序集的本机 DLL 肯定是不正常的。但是您必须进行干预并阻止它这样做。

于 2013-10-22T08:36:19.053 回答
1

您可以添加参考,然后设置此参考的属性

将本地副本设置为 False

于 2013-10-22T03:23:47.427 回答