我有一个一直运行良好的程序,但是当我对程序从其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 vs. 48kb dll大小)。我找到此信息的其中一个链接:click me。
所以我创建了一个虚拟机并在其上安装了WinXP Professional,并导航到C:\WINDOWS\system32\
并将位于那里的Shell32.dll
复制到我的主机上。奇怪的是,DLL的大小约为8mb,而不是我所期望的52kb。当我从VS2012添加它作为资源时,我浏览到复制的文件并添加它(复制本地),但由于某种原因,它最终大小为48kb,程序继续在上面提到的行崩溃。 / p>
我尝试使用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。
有没有人对这些问题/事件有任何经验?任何见解/提示/解决方案将不胜感激。
谢谢!
答案 0 :(得分:0)
将一个过时的系统dll拖到更新版本的Windows是一个刚刚失败的东西,特别是如果它(如本例所示),一个COM互操作DLL。如果Windows 8正在运行COM服务,它将使用其“自己的”DLL版本运行它。如果您尝试使用不同版本的接口DLL与它进行交互,则会出现接口不匹配的情况。如您所见,E_NOINTERFACE
。
您正在尝试使用版本6 DLL与版本8服务进行通信。它必然会遇到问题。
大小的差异可能与有关,Visual Studio将部署DLL解压缩到接口,而不是包括所有实现。