【问题标题】:MSI setup auto copying Shell32.dll, causing problemsMSI 设置自动复制 Shell32.dll,导致问题
【发布时间】:2013-10-22 03:21:26
【问题描述】:

应用程序需要使用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 位操作系统中会不会有问题?

编辑2: shell32.dll C:\Windows\system32\ 实际上是 5KB,但 MSI 复制了 11 MB。这是什么?

【问题讨论】:

    标签: c# .net visual-studio-2010 dll


    【解决方案1】:

    您必须阻止安装程序复制 shell32.dll。它是一个关键的操作系统 DLL,始终包含在 Windows 中。错误版本的 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 肯定是不正常的。但你必须干预并阻止它这样做。

    【讨论】:

    • 是的,它确实会到处复制 Interop.Shell32.dll,这个程序集从来都不是问题。 shell32.dll 出现问题。它会自动与 msi 合并并复制到安装目录。我设法将它从 msi 中排除。我希望它不会在 64 位操作系统上崩溃。
    • 墨菲定律确保未经测试的代码总是在另一台机器上崩溃。
    • 没错,我已经在 Win 8 64 位上进行了测试,无论是否使用 shell32.dll,都可以正常工作。未使用 win 7 进行测试。
    【解决方案2】:

    你可以添加引用,然后设置这个引用的属性

    设置复制本地为False

    【讨论】:

    • shell32.dll 从不复制到 Build 目录,但只有在安装后,MSI 才会将它复制到那里。
    • 这是不正确的,需要 Copy Local = True 才能将互操作程序集复制到与 EXE 相同的目录。没有它,程序就无法运行。
    猜你喜欢
    • 2012-11-12
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多