我有一个程序一直工作得很好,但是当我对程序从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版本(52 XP与48 XP的dll大小)。我找到这个信息的链接之一是:点击我。
因此,我创建了一个虚拟机并在其上安装了WinXP Professional,并导航到C:\WINDOWS\system32\并将位于那里的Shell32.dll复制到我的主机上。奇怪的是,DLL的大小为8MB,而不是我所期望的52 is。当我从VS2012中将它作为资源添加时,我浏览到复制的文件并添加它(带有副本本地),但由于某种原因,它的大小为48 in,程序继续在上面提到的行崩溃。
我尝试将DotNetZip与其他C#库一起用于压缩管理,由于某些原因,它们无法正常工作(创建损坏的zip文件,根本不创建它们,拒绝向归档中添加随机文件/文件夹等)。在这个问题之前,这个程序运行得完美无缺,所以最让我困惑的是,为什么它突然不能工作,为什么Shell32.dll不是A)我引用的8mb版本,和B)‘剥离’到48 8mb。最重要的是,我检查了程序的当前部署,该程序缺乏当前版本的一些特性,而且DLL的大小为48 no,而且这个特定的部署没有问题。
我还应该提到,我目前正在运行Windows8Pro,并在VS2012中进行开发。部署环境是Windows 2008 R2。我最初是在Windows 8极限版上用VS2010编写这个程序的。当我第一次在VS2012中打开项目时,没有升级对话框。所有操作系统的列表(除了WinXP Pro)都是x64。
有没有人对这些问题/事件有过经验?任何见解/技巧/解决方案将不胜感激。
谢谢!
发布于 2013-01-17 04:29:34
将过时的系统DLL拖到较新版本的Windows上肯定会失败,特别是如果它是COM互操作dll (在本例中)的话。如果Windows 8正在运行COM服务,它将使用其“自己”版本的DLL运行它。如果然后尝试使用不同版本的接口DLL与其交互,则会出现接口不匹配。正如你所看到的,E_NOINTERFACE。
您正在尝试使用version 6 DLL与version 8服务通信。肯定会遇到麻烦的。
大小的差异可能与Visual将部署DLL剥离到只是接口有关,而不是包括所有的实现。
https://stackoverflow.com/questions/14371538
复制相似问题