【问题标题】:Why Does the Excel.Application App.GetType().Name return ComObject?为什么 Excel.Application App.GetType().Name 返回 ComObject?
【发布时间】:2014-04-29 03:51:03
【问题描述】:

使用 VisualStudio 2008,我创建了一个简单的 Excel 2007 插件项目。

我添加如下代码...

var app = Application;
var members = app.GetType().GetMembers(BindingFlags.Public|
               BindingFlags.NonPublic|
               BindingFlags.Instance|
               BindingFlags.Static);
var typeName = app.GetType().Name;

...到 ThisAddIn_Startup 方法(并解决对 System.Reflection 的缺失引用)。

当我运行代码时,typeName 是“_ComObject”。我期待像“Excel.ApplicationClass”这样的东西。而且,members 只包含 26 个成员,远远少于 Excel.Application 对象。单步执行代码,我将鼠标悬停在应用程序上,并显示了许多成员(所有成员都带有蓝色图标,这有点奇怪)。但是,显示的类型名称是“System.Runtime.Remoting.Proxies._TransparentProxy”,这又不是我的预期。

在设计时,键入 app{dot} 以获取“Intelli-sense”会列出可供选择的所有类型的成员,即它会列出所有 Excel.Application 成员。

此外,如果我运行 Powershell 脚本...

$obj = New-Object -ComObject excel.application
$obj | get-member

...输出列出了所有 Excel.Application 成员。

那么,如何在运行时获取 C# 中所有 Excel.Application 成员的 MemberInfo 对象?

最后,以防万一,我在创建项目时选择 Excel 2007 Add-In 模板,然后转到属性->调试并告诉它启动 Excel 2010。这就是我希望构建 2007 插件的方式-in 这也适用于 Office 2010。我为 Word 加载项做了一个非常相似的方法,结果与我预期的一样。

【问题讨论】:

  • 可能正在使用一个适用的(“早期绑定”)接口。
  • 你可能想看看这篇文章:c-sharpcorner.com/UploadFile/psingh/…
  • @Pete 您推荐的文章有助于获得会员。谢谢

标签: c# excel office-interop


【解决方案1】:

这个问题与“为什么”有关,我通过反思得到了 26 个成员。我按照 Pete 的建议阅读了这篇文章,并使用...

var excel = Type.GetTypeFromProgID("Excel.Application");
var members = excel.GetMembers( ... );

...我找到了 700 多个成员。

但这仍然没有回答我的问题。我想知道为什么我不会使用正常反射来获得它。如果有人可以用一个很好的解释和一些文档参考来回复,我会将他们的答案标记为答案。

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2018-10-20
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多