C# Excel互操作访问ViolationException

C# Excel互操作访问ViolationException,c#,excel,vsto,C#,Excel,Vsto,System.AccessViolationException:尝试读或写保护 记忆。这通常表示其他内存已损坏。 在System.RuntimeType.ForwardCallToInvokeMember(字符串memberName, BindingFlags标志、对象目标、Int32[]aWrapperTypes、MessageData& 姆斯格达塔) 我是打电话来的 myRangeObj.Insert(CopyOrigin: XlInsertFormatOrigin.xlFormatFrom

System.AccessViolationException:尝试读或写保护 记忆。这通常表示其他内存已损坏。
在System.RuntimeType.ForwardCallToInvokeMember(字符串memberName, BindingFlags标志、对象目标、Int32[]aWrapperTypes、MessageData& 姆斯格达塔)

我是打电话来的

myRangeObj.Insert(CopyOrigin: XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
然后Excel就崩溃了

这种行为相当有趣。若我并没有附加到调试器Excel,那个么它就会崩溃,并且不会命中全局异常处理程序。在事件查看器中,条目为

故障应用程序名称:EXCEL.EXE,版本:15.0.4867.1000,时间 邮票:0x57d799c6
故障模块名称:ntdll.dll,版本:6.1.7601.23543,时间戳:0x57d2fde1
异常代码:0xc0000005
故障偏移量:0x00000000000724a8
出错进程id:0x1720
故障应用程序启动时间:0x01d241b7c6c06d70
故障应用程序路径: C:\Program Files\Microsoft Office\Office15\EXCEL.EXE
故障模块路径:C:\windows\SYSTEM32\ntdll.dll
报告Id:2974b4d0-adab-11e6-828a-44850096768d

如果我确实附加到调试器,有时我可以在
TargetInvocationException
之后立即获得AccessViolationException抛出

如果我尝试在该行周围添加一个try-catch块,visualstudio将崩溃,而catch块代码将不会被命中

此问题仅在某些机器上重现,我们注意到,
Application.Calculate()
调用也可能导致此问题

此问题已在Windows 7、Windows 10和Windows Server 2008中复制,所有版本均使用32位Excel 2013


任何想法都将不胜感激。

这些
accessViolationException
非常难以分析。昨天我在Excel2013/Windows10上的一些Innomy
ribbonUI.ActivateTab(…)
中遇到了一个非常类似的问题。我在WinDbg中分析了3个小时的内存转储,只是为了看到在mso.dll的深处,指令指针得到0x0,这基本上只是意味着某个地方有一个
NullReference
。但是,如果excel.exe/mso.dll没有可用的符号,请好运找到原因。我以前也有过类似的例子,我发现如果你在Excel没有预料到的情况下做了一些事情,那么大多数都与时间问题有关。@haindl你认为这可能与分配bunch COM对象而不释放它们有关吗?这当然有可能!如果你不释放你所有的COM对象,就会发生很多神秘的事情。我过去也没有这样做,结果是如果Excel中嵌入了Word文档,它就会崩溃。疯狂的东西。。。但当我把它们全部释放后,一切都很好。我查看了我的文档,在2015-09-08的补丁日之后,我在Excel 2013中发现了一个
AccessViolationException
,其中一个简单的调用
range.HasFormula
range.HasArray
只是“毒药”整个过程会导致
AccessViolation
在以后做正常事情时发生。我找到了
HasFormula
的解决方法(对
Formula
进行了奇怪的检查),但到目前为止我还没有
HasArray
的解决方法。最大的困难来自这样一个事实:您的原始调用可能直接负责,也可能不直接负责
AccessViolationException
。我在注释完所有内容后,通过反复尝试,找到了无数的解决方案,然后一句接一句地重新启用。我多年来一直在开发Excel COM/VSTO加载项,我的文档非常丰富,尤其是对
AccessViolationExceptions
的引用。您可以尝试分析内存转储。这些
accessViolationException
非常难以分析。昨天我在Excel2013/Windows10上的一些Innomy
ribbonUI.ActivateTab(…)
中遇到了一个非常类似的问题。我在WinDbg中分析了3个小时的内存转储,只是为了看到在mso.dll的深处,指令指针得到0x0,这基本上只是意味着某个地方有一个
NullReference
。但是,如果excel.exe/mso.dll没有可用的符号,请好运找到原因。我以前也有过类似的例子,我发现如果你在Excel没有预料到的情况下做了一些事情,那么大多数都与时间问题有关。@haindl你认为这可能与分配bunch COM对象而不释放它们有关吗?这当然有可能!如果你不释放你所有的COM对象,就会发生很多神秘的事情。我过去也没有这样做,结果是如果Excel中嵌入了Word文档,它就会崩溃。疯狂的东西。。。但当我把它们全部释放后,一切都很好。我查看了我的文档,在2015-09-08的补丁日之后,我在Excel 2013中发现了一个
AccessViolationException
,其中一个简单的调用
range.HasFormula
range.HasArray
只是“毒药”整个过程会导致
AccessViolation
在以后做正常事情时发生。我找到了
HasFormula
的解决方法(对
Formula
进行了奇怪的检查),但到目前为止我还没有
HasArray
的解决方法。最大的困难来自这样一个事实:您的原始调用可能直接负责,也可能不直接负责
AccessViolationException
。我在注释完所有内容后,通过反复尝试,找到了无数的解决方案,然后一句接一句地重新启用。我多年来一直在开发Excel COM/VSTO加载项,我的文档非常丰富,尤其是对
AccessViolationExceptions
的引用。您可以尝试分析内存转储。