【问题标题】:.net core COM with Excel range.net core COM 与 Excel 范围
【发布时间】:2020-05-29 20:14:26
【问题描述】:

我遇到了一个问题,我无法访问某个范围的 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-core com


    【解决方案1】:

    我发现了问题所在。对于使用 .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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2017-12-05
      • 2018-12-24
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多