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」のようなものを期待していました。また、メンバーには、Excel.Application オブジェクトよりもはるかに少ない 26 のメンバーしか含まれていません。コードをステップ実行すると、アプリにカーソルを合わせると、多くのメンバーが表示されます (すべてのメンバーが青色のアイコンになっていますが、これは少し奇妙です)。ただし、表示されるタイプ名は「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 に答える