C#和shell32.dll中的System.AccessViolationException异常

时间:2013-07-13 05:35:54

标签: .net pinvoke

我编写了一个代码片段,用于删除SHFileOperation方法中的指定目录。

来自pinvoke.net

的SHFileOperation类

流动是我的测试代码:

 var interop = new InteropSHFileOperation();
 interop.wFunc = InteropSHFileOperation.FO_Func.FO_DELETE;
 interop.pFrom = path;
 interop.fFlags.FOF_SILENT = true;
 interop.fFlags.FOF_NOERRORUI = true;
 interop.fFlags.FOF_NOCONFIRMATION = true;
 return interop.Execute();          

上面的代码可以在我的电脑上运行(win7,32-bit,.net 4.0),

但是当我将代码运行到我的另一台计算机上时(win 2008,64-bit,.net 4.0),我得到了流量错误(来自windows事件查看器):

Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
   at Shopbots.IO.InteropSHFileOperation.SHFileOperation(SHFILEOPSTRUCT ByRef)
   at Shopbots.IO.InteropSHFileOperation.SHFileOperation(SHFILEOPSTRUCT ByRef)
   at Shopbots.IO.InteropSHFileOperation.Execute()

来自windows exceton对话框

event name : APPCRASH
Fault Module Name:  shell32.dll
Fault Module Version:   6.0.6002.18646
Fault Module Timestamp: 4fd23d65
Exception Code: c0000005

[更新2]

根据“不要声明包大小的值。如果省略它,则在编组时使用正确的值,并且单个SHFILEOPSTRUCT可用于32位和64位操作。< / strong>“来自另一篇文章:http://www.pinvoke.net/default.aspx/Structures/SHFILEOPSTRUCT.html

更改SHFILEOPSTRUCT声明工作32位和64位Windows操作系统(因为pinvoke站点的InteropSHFileOperation类声明了32位操作符系统的SHFILEOPSTRUCT结构)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct SHFILEOPSTRUCT
{
  ....
}

1 个答案:

答案 0 :(得分:1)

SHFileOperation最常见的故障模式是路径需要双重终止。我怀疑你忘了这样做,如果你这样做,访问违规就是一个可能的结果。

至于struct的打包,它是一个标准的Win32结构。它没有包装,它是对齐的。从Pack属性中删除StructLayout参数。

我无法理解你为什么不打电话给FileSystem.DeleteDirectory