【问题标题】:Wrong Interop.Shell32.dll being loaded suddenly突然加载错误的 Interop.Shell32.dll
【发布时间】:2013-03-12 21:44:24
【问题描述】:

我有一个运行良好的程序,但是当我对程序从其 ini 加载的方式进行小幅更改时,压缩功能停止工作。我逐步浏览了程序,发现错误发生在以下行:

    var fs = File.Create(zipPath);
    fs.Write(emptyZip, 0, emptyZip.Length);
    fs.Flush();
    fs.Close();
    var sc = new Shell32.ShellClass();
    var srcFlder = sc.NameSpace(program.Path); //THIS LINE
    var destFlder = sc.NameSpace(zipPath);
    var items = srcFlder.Items();
    destFlder.CopyHere(items, 20);
    System.Threading.Thread.Sleep(500);
    ZippedPrograms.Add(zipPath);

我仔细检查了变量program.Path 和其他被发送到ShellClass() 的变量,它们不为空或为空。这是程序到达这一行时弹出的实际错误:

做一些谷歌搜索,我发现我在程序中引用的 Shell32.dll 显然不适用于 7(或服务器 2008,目标环境),我需要引用 XP 版本(52kb 与 48kb dll尺寸)。我找到此信息的链接之一:click me

所以我创建了一个虚拟机并在其上安装了 WinXP Professional,然后导航到 C:\WINDOWS\system32\ 并将位于那里的 Shell32.dll 复制到我的主机上。奇怪的是,DLL 的大小约为 8mb,而不是我预期的 52kb。当我将它作为 VS2012 的资源添加时,我浏览到复制的文件并添加它(使用本地复制),但由于某种原因,它最终大小为 48kb,并且程序继续在上述行崩溃。

我曾尝试使用 DotNetZip 和其他 C# 库进行 zip 管理,但由于某种原因,它们无法正常工作(创建损坏的 ZIP 文件,根本不创建它们,拒绝将随机文件/文件夹添加到存档等) .在这个问题之前,该程序运行完美,所以最让我困惑的是为什么它突然不起作用以及为什么 Shell32.dll 不是 A)我引用的 8mb 版本,以及 B)“精简”到 48kb。最重要的是,我检查了该程序的当前部署,其中缺少当前版本的某些功能等,并且那里的 DLL 大小为 48kb,并且此特定部署没有问题。

我还应该提到我目前正在运行 Windows 8 Pro,并在 VS2012 中进行开发。部署环境为 Windows Server 2008 R2。我最初在 Windows 8 Ultimate 上的 VS2010 中编写了这个程序。 VS2012第一次打开项目时,出现no升级对话框。列出的所有操作系统(WinXP Pro 除外)都是 x64。

有没有人遇到过这些问题/事件?任何见解/提示/解决方案将不胜感激。

谢谢!

【问题讨论】:

    标签: c#


    【解决方案1】:

    将过时的系统 dll 拖到较新版本的 Windows 肯定会失败,特别是如果它(如本例中)是 COM 互操作 DLL。如果 Windows 8 正在运行 COM 服务,它将使用其“自己的”版本的 DLL 来运行它。如果您随后尝试使用不同版本的接口 DLL 与其交互,您将得到接口不匹配。如您所见,E_NOINTERFACE

    您正在尝试使用版本 6 的 DLL 与版本 8 的服务进行通信。难免会遇到问题。

    大小的差异可能与 Visual Studio 将部署 DLL 剥离为仅接口而不是包括所有实现有关。

    【讨论】:

    • 感谢您的洞察力。我只是很困惑为什么它在运行一段时间后突然停止工作。
    • 所以你让它在没有本地复制 DLL 的 Windows 8 中工作?但是在您更改程序从 ini 读取的方式后停止工作。但是,您没有逆转对 ini 加载所做的更改,而是带来了不同的 DLL 版本?如果是这样的话,我怀疑它并没有你最初想象的那么好。
    • 有点,我不认为我在 win8 上测试过它(因为我刚刚升级到它)。它在 win7(原始开发操作系统)和 win server 2008 R2(部署环境)上运行顺利,但当我尝试更新应用程序(添加一些功能和 ini 功能)时,一切都失败了。请注意,我没有对压缩逻辑进行任何更改,也没有尝试获取新的 DLL。此外,它是在本地复制的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多