代码之家  ›  专栏  ›  技术社区  ›  Andrew Cowenhoven

Excel加载项访问冲突

  •  0
  • Andrew Cowenhoven  · 技术社区  · 16 年前

    使用c#、VS2005和.NET2.0。(XP 32位)这是一个Winforms应用程序,由VBA加载项(.xla)通过互操作库调用。这个应用程序已经存在了一段时间,当程序集在我的开发机器之外的任何地方编译和执行时,它可以正常工作。在dev上,它会严重崩溃(在调试器中,仅运行对象),并出现“未处理的异常在0x…在EXCEL.EXE中: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);
            {...}
    
        }
    

    这看起来像是某种环境问题。你是谁?可能是代码错误,但它在其他地方运行良好。

    3 回复  |  直到 16 年前
        1
  •  2
  •   to StackOverflow    16 年前

    我过去在Office 2003的这种情况下遇到过问题。一些有帮助的事情:

    • 安装Office 2003 Service Pack 2停止了关闭Excel时发生的一些崩溃。

    • 运行Excel VBA CodeCleaner http://www.appspro.com/Utilities/CodeCleaner.htm 定期帮助防止随机崩溃。

    • 从多个线程访问Excel对象是不可靠的,所以我希望您不要这样做。

    如果你有可能,你也可以尝试打开一个案件与微软PSS。如果你能重现这个问题,它们是相当好的。而且在大多数情况下,这类事情是一个bug,因此您不会因此而收费:)

        2
  •  0
  •   Steve Cooper    16 年前

    你的开发机器是Win64吗?如果将构建平台设置为x86,应用程序的win64构建就会消失。

        3
  •  0
  •   Robert S.    16 年前