0

我有一个运行良好的程序,但是当我对程序从其 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 大小)。我在其中找到此信息的链接之一:单击我

因此,我创建了一个虚拟机并在其上安装了 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第一次打开项目时,没有升级对话框。列出的所有操作系统(WinXP Pro 除外)都是 x64。

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

谢谢!

4

1 回答 1

0

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

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

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

于 2013-01-17T04:29:34.967 回答