具有 Excel 范围的 .net 核心 COM
.net core COM with Excel range
我遇到一个问题,我无法访问某个范围的 Name 对象。所以,我正在调用 Excel.Application.get_Range() 并传入一个名称。它 returns 是一个非空对象,我可以访问方法。然而,Range.Namereturns一个System.__ComObject()。如果我尝试访问 Range.Name.Name,我会收到类似于以下内容的异常
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.__ComObject' does not contain a definition for "Name"
另外,这个项目是我从.net Framework 迁移到.net Core 的项目。完全相同的代码在 Framework 中工作。我尝试了各种方法来确定底层类型是什么(因为它似乎不是 Name 对象)。 ITypeInfo returns typename 是 Name 所以它看起来确实是一个名称对象。
我不知道为什么我无法在 .net 核心中访问 Name.Name。当我检查 .net Core Excel 示例时,他们从不访问名称对象。
此外,我还可以访问其他 COM 对象,例如 ListObject。
我明白问题出在哪里了。对于其他 运行 使用 .net Core 的人来说,问题是 .net core 似乎不通过 COM 自动支持动态类型。这将在以下 github 问题 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;
顺便说一句,我还注意到,如果您 copy/paste 将上面的强制类型转换到调试监视中 window 它不会正确显示,而是显示有关无效强制类型转换的异常。
我遇到一个问题,我无法访问某个范围的 Name 对象。所以,我正在调用 Excel.Application.get_Range() 并传入一个名称。它 returns 是一个非空对象,我可以访问方法。然而,Range.Namereturns一个System.__ComObject()。如果我尝试访问 Range.Name.Name,我会收到类似于以下内容的异常
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.__ComObject' does not contain a definition for "Name"
另外,这个项目是我从.net Framework 迁移到.net Core 的项目。完全相同的代码在 Framework 中工作。我尝试了各种方法来确定底层类型是什么(因为它似乎不是 Name 对象)。 ITypeInfo returns typename 是 Name 所以它看起来确实是一个名称对象。
我不知道为什么我无法在 .net 核心中访问 Name.Name。当我检查 .net Core Excel 示例时,他们从不访问名称对象。
此外,我还可以访问其他 COM 对象,例如 ListObject。
我明白问题出在哪里了。对于其他 运行 使用 .net Core 的人来说,问题是 .net core 似乎不通过 COM 自动支持动态类型。这将在以下 github 问题 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;
顺便说一句,我还注意到,如果您 copy/paste 将上面的强制类型转换到调试监视中 window 它不会正确显示,而是显示有关无效强制类型转换的异常。