在无法访问范围的名字对象时,我遇到了一个问题。因此,我调用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框架迁移到.net核心的一个项目。完全相同的代码在Framework中工作。我尝试过各种方法来确定基础类型是什么(因为它似乎不是Name对象)。ITypeInfo返回类型名称是名称,因此它看起来确实是一个Name对象。
我不明白为什么我无法访问Name.Name内核中的.net。当我检查.net核心Excel示例时,他们从不访问名称对象。
此外,我还可以访问其他COM对象,如ListObject。
发布于 2020-02-15 00:51:13
我知道问题出在哪里了。对于使用.net核心的其他人来说,问题是.net核心似乎不支持通过COM自动进行的动态类型。这将在下面的github发行版Github动态不工作问题中讨论。讨论为什么这个不起作用。
基本上,对于我的具体情况,我需要手动转换类型,然后它就开始工作了。这也会影响IEnumerable COM类型的使用,这些类型需要在迭代它们之前直接转换到IEnumerable。
假设您有以下使用语句。
using Excel = Microsoft.Office.Interop.Excel;我不得不做以下几点:
return range.Name.Name;转到
return ((Excel.Name)range.Name).Name;另外,我还注意到,如果将上面的强制转换复制/粘贴到调试监视窗口中,它不会正确显示,而是显示无效强制转换的异常。
https://stackoverflow.com/questions/60219384
复制相似问题