Excel加载项访问冲突
时间:2020-03-06 14:26:49 来源:igfitidea点击:
使用c#,VS2005和.NET 2.0。 (XP 32位)这是一个Winforms应用,由VBA插件(.xla)通过Interop库调用。这个应用程序已经存在了一段时间,并且在我的开发机器以外的任何地方编译和执行程序集时,都可以正常工作。在开发环境中,它会崩溃(在调试器中并且仅运行对象),并且在EXCEL.EXE中出现"未处理的异常,发生在0x ...... 0x ...违反读取位置0x ...
但这是奇怪的部分:
我界面中的第一种方法工作正常。所有其他方法都如上所述崩溃。这是代码的近似值:
[Guid("123Fooetc...")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IBar { [DispId(1)] void ThisOneWorksFine(Excel.Workbook ActiveWorkBook); [DispId(2)] string Crash1(Excel.Workbook ActiveWorkBook); [DispId(3)] int Crash2(Excel.Workbook activeWorkBook, Excel.Range target, string someStr); } [Guid("345Fooetc..")] [ClassInterface(ClassInterfaceType.None)] [ProgId("MyNameSpace.MyClass")] public class MyClass : IBar { public void ThisOneWorksFine(Excel.Workbook ActiveWorkBook) {...} string Crash1(Excel.Workbook ActiveWorkBook); {...} int Crash2(Excel.Workbook activeWorkBook, Excel.Range target, string someStr); {...} }
似乎是某种环境问题。注册表搞砸了?可能是代码错误,但在其他地方也可以正常工作。
解决方案
开发机器是Win64吗?如果将构建平台设置为x86,我的win64构建应用程序就会出现问题,这些应用程序会消失。
过去在Office 2003的这种情况下,我遇到了问题。一些有用的东西:
- 安装Office 2003 Service Pack 2可以停止关闭Excel时发生的某些崩溃。
- 安装Office 2003 Service Pack 3可修复在VSTO2005应用程序中使用XP样式的错误(此处不涉及情况)
- 定期运行Excel VBA CodeCleaner http://www.appspro.com/Utilities/CodeCleaner.htm有助于防止随机崩溃。
- 从多个线程访问Excel对象会很麻烦,所以我希望我们不要这样做。
如果有可能,我们还可以尝试使用Microsoft PSS打开案例。如果我们能够重现该问题,它们就很好。而且在大多数情况下,这种事情是一个错误,因此我们无需为此付费:)
开发机器运行的Office版本是否不同于其他机器?我知道PIA有所不同。因此,例如,如果我们在Office 2003上进行开发并在Office 2007上进行测试(反之亦然),则会遇到问题。