Office ソリューションの遅延バインディング
Office アプリケーションのオブジェクト モデルの一部の型には、遅延バインディング機能を通じて使用できる機能があります。 たとえば、一部のメソッドおよびプロパティは、Office アプリケーションのコンテキストに応じて異なるオブジェクトの型を返すことができ、一部の型は異なるコンテキストで異なるメソッドまたはプロパティを公開できます。
対象: このトピックの情報は、Microsoft Office 2010 および 2007 Microsoft Office system のドキュメント レベルのプロジェクトおよびアプリケーション レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
Option Strict がオフの Visual Basic プロジェクトおよび .NET Framework 4 を対象とする Visual C# プロジェクトでは、これらの遅延バインディング機能を使用する型を直接操作できます。 Option Strict がオンの Visual Basic プロジェクトおよび .NET Framework 3.5 を対象とする Visual C# プロジェクトでは、これらの型を使用するにはキャストまたはリフレクションを使用する必要があります。
オブジェクト戻り値の暗黙的および明示的なキャスト
Microsoft Office プライマリ相互運用機能アセンブリ (PIA: Primary Interop Assembly) の多くのメソッドとプロパティは、いくつかの異なる型のオブジェクトを返すことができるため、Object 値を返します。 たとえば、ActiveSheet プロパティは、作業中のシートが何であるかに応じて戻り値が Worksheet オブジェクトまたは Chart オブジェクトになるため、Object を返します。
メソッドまたはプロパティが Object を返す場合、Option Strict がオンの Visual Basic プロジェクトおよび .NET Framework 3.5 を対象とする Visual C# プロジェクトでは、オブジェクトを正しい型に明示的に変換 (Visual Basic の場合) またはキャスト (C# の場合) する必要があります。 Option Strict がオフの Visual Basic プロジェクトおよび .NET Framework 4 を対象とする Visual C# プロジェクトでは、Object の戻り値を明示的にキャストする必要はありません。
ほとんどの場合、Object を返すメンバーの戻り値として使用できる型の一覧は、リファレンス ドキュメントに記載されています。 オブジェクトを変換またはキャストすると、コード エディターでオブジェクトに対する IntelliSense が有効になります。
Visual Basic での変換については、「暗黙の型変換と明示的な型変換 (Visual Basic)」および「CType 関数 (Visual Basic)」を参照してください。 Visual C# でのキャストについては、「キャストと型変換 (C# プログラミング ガイド)」および「() 演算子 (C# リファレンス)」を参照してください。
例
次のコード例では、Option Strict がオンの Visual Basic プロジェクトまたは .NET Framework 3.5 を対象とする Visual C# プロジェクトで、オブジェクトを特定の型にキャストする方法を示します。 これらのプロジェクトの種類では、Cells プロパティを Range に明示的にキャストする必要があります。 この例では、Sheet1 という名前のワークシート クラスを持つドキュメント レベルの Excel プロジェクトが必要です。
Dim castRange As Excel.Range = CType(Globals.Sheet1.Cells(1, 1), Excel.Range)
Excel.Range castRange = (Excel.Range)Globals.Sheet1.Cells[1, 1];
次のコード例では、Option Strict がオフの Visual Basic プロジェクトまたは .NET Framework 4 を対象とする Visual C# プロジェクトで、オブジェクトを特定の型に暗黙的にキャストする方法を示します。 これらのプロジェクトの種類では、Cells プロパティが Range に暗黙にキャストされます。 この例では、Sheet1 という名前のワークシート クラスを持つドキュメント レベルの Excel プロジェクトが必要です。
Dim dynamicRange As Excel.Range = Globals.Sheet1.Cells(1, 1)
Excel.Range dynamicRange = Globals.Sheet1.Cells[1, 1];
遅延バインディングを介してのみ使用できるメンバーへのアクセス
Office PIA の一部のプロパティおよびメソッドは、遅延バインディングを介してのみ使用できます。 Option Strict がオフの Visual Basic プロジェクトまたは .NET Framework 4 を対象とする Visual C# プロジェクトでは、これらの言語の遅延バインディング機能を使用して、遅延バインディングされたメンバーにアクセスできます。 Option Strict がオンの Visual Basic プロジェクトまたは .NET Framework 3.5 を対象とする Visual C# プロジェクトでは、これらのメンバーにアクセスするにはリフレクションを使用する必要があります。
例
次のコード例では、Option Strict がオフの Visual Basic プロジェクトまたは .NET Framework 4 を対象とする Visual C# プロジェクトで、遅延バインディングされたメンバーにアクセスする方法を示します。 この例では、Word の [ファイルを開く] ダイアログ ボックスの遅延バインディングされた Name プロパティにアクセスします。 このコード例を使用するには、Word プロジェクトの ThisDocument クラスまたは ThisAddIn クラスから実行します。
Private Sub TestDynamicDialog()
Dim dialog As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
dialog.Name = "Testing"
dialog.Show()
MessageBox.Show(dialog.Name)
End Sub
dynamic dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
dialog.Name = "Testing";
dialog.Show();
MessageBox.Show(dialog.Name);
次のコード例では、Option Strict がオンの Visual Basic プロジェクトまたは .NET Framework 3.5 を対象とする Visual C# プロジェクトで、リフレクションを使用して同じタスクを実行する方法を示します。
Dim dlg As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
Dim dlgType As Type = GetType(Word.Dialog)
' Set the Name property of the dialog box.
dlgType.InvokeMember("Name", _
Reflection.BindingFlags.SetProperty Or _
Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.Instance, _
Nothing, dlg, New Object() {"Testing"}, _
System.Globalization.CultureInfo.InvariantCulture)
' Display the dialog box.
dlg.Show()
' Show the Name property.
MessageBox.Show(dlgType.InvokeMember("Name", _
Reflection.BindingFlags.GetProperty Or _
Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.Instance, _
Nothing, dlg, Nothing, _
System.Globalization.CultureInfo.InvariantCulture))
Word.Dialog dialog = Application.Dialogs[Word.WdWordDialog.wdDialogFileOpen];
System.Type dialogType = typeof(Word.Dialog);
// Set the Name property of the dialog box.
dialogType.InvokeMember("Name",
System.Reflection.BindingFlags.SetProperty |
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance,
null, dialog, new object[] { "Testing" },
System.Globalization.CultureInfo.InvariantCulture);
// Display the dialog box.
dialog.Show(ref missing);
// Show the Name property.
MessageBox.Show(dialogType.InvokeMember("Name",
System.Reflection.BindingFlags.GetProperty |
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance,
null, dialog, null,
System.Globalization.CultureInfo.InvariantCulture).ToString());