首页 > 解决方案 > .net core COM 与 Excel 范围

问题描述

我有一个问题,我无法访问范围的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返回 typename 是 Name 所以它看起来确实是一个名称对象。

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

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

标签: c#excel.net-corecom

解决方案


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

基本上,对于我的具体情况,我需要手动转换类型,然后它才能工作。这也会影响 IEnumerable COM 类型的使用,这些类型需要在迭代之前直接转换为 IEnumerable。

假设您有以下 using 语句。

using Excel = Microsoft.Office.Interop.Excel;

我不得不打开以下内容:

return range.Name.Name;

进入

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

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


推荐阅读