0

使用 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 加载项模板,然后转到属性->调试并告诉它启动 Excel 2010。这就是我希望构建一个 2007 加载项的方式也适用于 Office 2010。我为 Word 加载项做了一个非常相似的方法,结果与我预期的一样。

4

1 回答 1

0

这个问题与“为什么”有关,我通过反思只有 26 个成员。我听从了皮特的建议并阅读了这篇文章,并使用...

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

...我能够找到超过 700 个成员。

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

于 2014-04-28T19:51:03.660 回答