为什么Excel.Application App.GetType()。Name返回ComObject?

时间:2012-12-19 22:15:55

标签: c# excel office-interop

使用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”这样的东西。并且,成员只包含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加载项模板,然后转到properties-> Debug并告诉它启动Excel 2010.这就是我希望构建2007的方法加载项也适用于Office 2010.我已经为Word加载项做了一个非常类似的方法,其结果与我期望的一样。

1 个答案:

答案 0 :(得分:0)

问题与"为什么"通过反思,我只有26名成员。我按照Pete的建议阅读了文章,然后使用......

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

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

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

相关问题