C# 突然加载错误的Interop.Shell32.dll

C# 突然加载错误的Interop.Shell32.dll,c#,C#,我有一个程序一直工作得很好,但是当我对程序从其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(

我有一个程序一直工作得很好,但是当我对程序从其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);
我仔细检查了发送到
ShellClass()
的变量
program.Path
和其他变量,它们不为null或空。这是程序到达此行时弹出的实际错误:

通过谷歌搜索,我发现我在程序中引用的
Shell32.dll
显然不适用于7(或Server2008,目标环境),我需要引用XP版本(52kb与48kb的dll大小)。我在其中找到此信息的链接之一:

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

我曾尝试将DotNetZip与其他C#库一起用于zip管理,但由于某些原因,它们无法正常工作(创建损坏的zip文件,根本不创建它们,拒绝将随机文件/文件夹添加到存档中,等等)。在本期发行之前,该程序工作得非常完美,因此我最困惑的是,为什么它突然不工作,为什么
Shell32.dll
不是a)我引用的8mb版本,B)“精简”到48kb。除此之外,我还检查了程序的当前部署,该部署缺少当前版本的一些功能,其中DLL的大小为48kb,并且此特定部署工作正常

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

有人有过这些问题/事件的经验吗?如有任何见解/提示/解决方案,将不胜感激


谢谢大家!

将过时的系统dll拖动到较新版本的Windows是注定要失败的,尤其是如果它(如本例中)是COM互操作dll。如果Windows 8正在运行COM服务,它将使用其“自己”版本的DLL运行该服务。如果您随后尝试使用不同版本的接口DLL与它进行交互,则会得到接口不匹配。正如您所看到的,
E\u NOINTERFACE

您正在尝试使用版本6 DLL与版本8服务通信。这肯定会遇到问题


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

感谢您提供的见解。我只是不明白为什么它在正常运行了一段时间后突然停止工作。所以你让它在Windows 8中工作,没有本地复制的DLL?但当您更改程序从ini读取的方式后,它停止工作。但是,您没有逆转对ini加载所做的更改,而是带来了不同的DLL版本?如果是这样的话,我的怀疑是它并没有像你最初想象的那样好用。有点,我不认为我在win8上测试过它(因为我刚刚升级到它)。它在win7(原始开发操作系统)和win server 2008 R2(部署环境)上运行时没有任何故障,但当我尝试更新应用程序(添加了一些功能和ini功能)时,一切都失败了。请注意,我没有对压缩逻辑进行任何更改,也没有尝试获取新的DLL。而且,它是本地复制的。