c# - .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。
解决方案
我弄清楚了问题所在。对于使用 .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;
顺便说一句,我还注意到,如果您将上面的演员表复制/粘贴到调试监视窗口中,它不会正确显示,而是显示有关无效演员表的异常。
推荐阅读
- npm - 是否有相当于 Bower 可插拔解析器的 npm
- javascript - 如何在传单上放置带有geojson的数字标记
- sql - SQL Server - 通过标志汇总日期
- webpack - 未找到模块,需要('file.hbs')
- php - 为什么我使用 curl 没有响应?
- django - 属性错误:模块 'volga.views' 没有属性 'add'
- python - Anaconda 离线 - 无法导入已安装的包
- c# - C# WCF SOAP 附件问题
- python - 带有子进程返回的 Python 脚本必须是 str,而不是 int evrything linter 说是这种情况
- .htaccess - 对某些页面和文件夹强制使用 HTTPS,对所有其他页面和文件夹强制使用 HTTP