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上进行测试(反之亦然),则会遇到问题。