首页 > 解决方案 > 如何在 C# 程序中调试由 Excel 互操作引起的 COM 异常?

问题描述

我正在开发一个 C# 应用程序,尝试使用 Excel 功能。为了做到这一点,我正在使用 Interop 作为一个库。我在以下源代码行中有一个例外:

Range rng_Destination = 
  xlApp.get_Range(xlWrkSht.Cells[2,1], 
                  xlWrkSht.Cells[xlWrkSht.Cells[1,1].CurrentArray.Rows.Count+1,
                                    dt_main.Columns.Count]);

为了调查这一点,我尝试添加xlWrkSht.Cells[2,1]到 Visual Studio 的 Watch 窗口,但这只是显示{System.__ComObject},这不是很有用。

所以,我尝试了另一种方法,使用这种源代码:

System.Diagnostics.Debug.WriteLine("xlWrkSht.Cells[2 ,1]: [%s]", 
                                   xlWrkSht.Cells[2, 1]);

但是,这会导致以下情况Exception

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
HResult=0x80131500
Message=Cannot dynamically invoke method 'WriteLine' because it has 
        a Conditional attribute
Source=<Cannot evaluate the exception source>
StackTrace:<Cannot evaluate the exception stack trace>

所以我的问题很简单:我怎样才能调试 Interop 相关的对象,就像提到的那样xlWrkSht.Cells[2, 1]

供您参考:我已经尝试取消选中“只是我的代码”,但这直到现在都没有帮助(我在互联网上的某个地方找到了这个,我不知道它的作用):

只是我的代码截图

我一直在寻找有关Interop调试的其他资源,但这些信息过于笼统,对我的具体情况没有用处。
我还在互联网上看到了一些关于事件查看器的帖子,但在那里,我只有一些“信息”和最多一些“警告”消息,没有“错误”消息(我一直在寻找“Windows 日志、应用程序/安全和系统”。

经过更多调查后编辑
同时我已经看到我可以找到该单元格的值,使用:

xlWrkSht.Cells[2, 1]
=> Dynamic View
  FormulaLocal

最后一个属性包含该值。

但是,以下问题是我需要获取此单元格所属的 Excel 数组:

xlWrkSht.Cells[2, 1].CurrentArray.

这个似乎无法访问,即使不使用“动态视图”。有任何想法吗?

标签: c#exceldebuggingoffice-interop

解决方案


推荐阅读