我有一个运行良好的程序,但是当我对程序从其 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。
有没有人对这些问题/事件有任何经验?任何见解/提示/解决方案将不胜感激。
谢谢!