.net core COM with Excel range



我遇到了无法访问范围的 Name 对象的问题。所以,我正在呼唤Excel.Application.get_Range((并传入一个名字。它返回一个非空对象,我可以访问方法。但是,Range.Name 返回一个 System.__ComObject((。如果我尝试访问 Range.Name.Name 则会收到类似于以下内容的异常

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.__ComObject' does not contain a definition for "Name"

另外,这个项目是我从.net Framework迁移到.net Core的项目。完全相同的代码在框架中工作。我已经尝试了各种方法来确定基础类型是什么(因为它似乎不是 Name 对象(。ITypeInfo返回类型名称为Name,因此它确实显示为name对象。

我不知道为什么我无法访问 .net 核心中的 Name.Name。当我检查.net Core Excel示例时,他们从不访问名称对象。

此外,我能够很好地访问其他COM对象,例如ListObject。

我想出了问题所在。对于使用 .net Core 遇到此问题的任何其他人来说,问题是 .net core 似乎不支持通过 COM 自动的动态类型。这在以下 github 问题中进行了讨论 Github 关于动态不起作用的问题。它在哪里谈论为什么这不起作用。

基本上,对于我的特定情况,我需要手动转换类型,然后它起作用了。这也会影响在循环访问之前需要直接强制转换为 IEnumerable 的 IEnumerable COM 类型的使用。

假设您有以下 using 语句。

using Excel = Microsoft.Office.Interop.Excel;

我不得不转以下几点:

return range.Name.Name;

return ((Excel.Name)range.Name).Name;

顺便说一句,我还注意到,如果您将上面的强制转换复制/粘贴到调试监视窗口中,它将无法正确显示,而是显示有关无效转换的异常。

最新更新