Microsoft Office と .NET の相互運用性

Paul Cornell
Microsoft Corporation

November 1, 2001

これまでに、 Microsoft® .NET プラットフォームがソリューション開発にもたらす新機能について聞いたことがあるでしょう。 きっと皆さんは、 これらの .NET 機能を Microsoft Office ソリューションと共にどのように利用できるかを考えていることでしょう。 今月のコラムで、私は Office と .NET が共にどのように機能するかをコード面からご紹介します。

.NET についてあまりご存知でない方は、 .NET の詳細情報と Office との関連性について、 先月のコラム「Introducing .NET to Office Developers」をご覧ください。

Office と .NET をどのように相互運用するのでしょうか ?

Microsoft Office Visual Basic® for Applications (VBA - COM (コンポーネント オブジェクト モデル) に基づく) コードと .NET は、 互いにネイティブに通信することはできません。 しかし、COM interop という .NET 機能が "コーラブル ラッパー" を提供しており、 図 1 に示されているように .NET と COM を相互運用できます。

Dd313957.office11012001-fig1(ja-jp,MSDN.10).gif

図 1. コーラブル ラッパーを使用した COM と .NET の相互運用性

"RCW (Runtime Callable Wrapper : ランタイム コーラブル ラッパー)" を使用すると、 COM コンポーネント (たとえば、Office VBA オブジェクト ライブラリ) が .NET (たとえば、Visual Basic .NET アプリケーション) で使用可能になります。 たとえば、Microsoft Visual Studio® .NET で [プロジェクト] メニューから [参照の追加] をクリックして [COM] タブをクリックし、 タイプ ライブラリ ファイルをダブルクリックし、[OK] をクリックすると、 Visual Studio .NET は COM タイプ ライブラリのオブジェクトとメンバを、 対応する .NET アセンブリに変換します (図 2 参照)。 .Net アセンブリが生成された後で、 クラスのインスタンスを作成し、 COM オブジェクトとメンバが .NET のネイティブなクラスとメンバであるかのように、 Visual Studio .NET からメンバを呼び出すことができます。

Dd313957.office11012001-fig2(ja-jp,MSDN.10).gif

図 2. Visual Studio .NET から COM オブジェクト ライブラリへの参照を追加する

"CCW (COM Callable Wrapper : COM コーラブル ラッパー)" を使用すると、 .NET アセンブリが COM (たとえば、Office VBA) で使用可能になります。 アセンブリ登録ツール (RegAsm.exe) という .NET Framework SDK ツールが、 .NET アセンブリ (COM ダイナミック リンク ライブラリ (DLL) または実行可能なファイル (EXE) に相当) のメタデータを読み取り、 COM が .NET アセンブリのクラスとメンバを呼び出すことを許可するレジストリ エントリを作成します。 RegAsm.exe を実行した後で、 Office Visual Basic Editor の [ツール] メニューの [参照設定] コマンドを使って、 生成した COM タイプ ライブラリ ファイルへの参照を設定できます。 その後、COM オブジェクトを作成すると、通常どおりメンバを呼び出せます。

RegAsm.exe を実行するには、 Microsoft Visual Studio コマンド プロンプトで以下のコマンドを入力します。 Microsoft Visual Studio コマンド プロンプトを起動するには、 [スタート] メニューから [プログラム]、[Microsoft Visual Studio.NET]、[Visual Studio.NET ツール] を順にポイントして [Visual Studio.NET コマンド プロンプト] をクリックします。

                  
regasm AssemblyPath /tlb:FileName.tlb

AssemblyPath には対象のアセンブリへのパスを指定し、 FileName にはタイプ ライブラリの名前を指定します。 以下に例を示します。

                  
regasm "C:\WINNT\Microsoft.NET\Framework\v1.0.2914\mscorlib.dll"
/tlb:"C:\MyOfficeProjects\MyOfficeProject1\mscorlib.tlb"

これで、mscorlib.dll .NET アセンブリに関する情報がレジストリに挿入され、 mscorlib.tlb タイプ ライブラリ ファイルが作成されます。 その結果、Office Visual Basic Editor の [参照設定] ダイアログ ボックス ([ツール] メニュー) からそのファイルにアクセスできるようになります。

.NET アセンブリとそのアセンブリに基づく Office ソリューションをユーザーに配布する必要があるでしょう。 配布の詳細については、 以下の「.NET ソリューションのパッケージ化と配布」をご覧ください。

"ActiveX コーラブル ラッパー"を使用すると、 .NET は .NET によって使用される Microsoft ActiveX® コントロール (Office Web コンポーネントなど) を使用できます。 Visual Studio .NET のツールボックスを右クリックして [ツールボックスのカスタマイズ] をクリックし、 [COM コンポーネント] タブでエントリを選択し、 [OK] をクリックすると (図 3 を参照)、 Visual Studio は他の .NET コントロールと同じように、 ツールボックスからの ActiveX コントロールを使用するコードを生成します。

Dd313957.office11012001-fig3(ja-jp,MSDN.10).gif

図 3. ActiveX コントロールを Visual Studio .NET のツールボックスに追加する

Office VBA から .NET Framework クラス ライブラリを呼び出す

Office VBA は、.NET Framework クラス ライブラリが提供する機能のいくつかの呼び出しを行うことができますが、 このアプローチにはいくつかの重要な制限事項があります。 それは、COM (Office VBA が基づいている) が .NET Framework クラス ライブラリの以下のものを認識しないためです。

  • パラメータ化されたコンストラクタ : 1 つ以上のパラメータを受け取るコンストラクタを持つ .NET Framework クラス ライブラリの任意クラスは、 そのクラスの任意インスタンスが COM の New と等価な設定になっている場合 (クラスが Office Visual Basic オブジェクト ブラウザに表示されていても)、 実行時エラーを生成するでしょう。 たとえば、Office VBA で Dim objWS As New Excel.Worksheet(Caption:="Sheet1") というようなコードは成立しません。 これは、コード (Caption:="Sheet1") が COM コード構文に従っていないためです。
  • パブリックではない静的 (共有) メンバ : PrivateProtected、または Static (Shared) とマークされている .NET Framework クラス ライブラリのどのプロパティ、メソッド、またはイベントも COM にアクセスできず、 Office Visual Basic オブジェクト ブラウザに表示されません。 .NET Framework クラス ライブラリ メンバが Public Instance とマークされている場合でも、 メンバのクラスにパラメータ化されたコンストラクタが存在する場合は、 Office Visual Basic オブジェクト ブラウザに表示されません。

.NET Framework クラス ライブラリのドキュメントを調べると、 COM から呼び出し可能なクラスとメンバが非常に少ないことに気付くはずです。 これは、.NET Framework クラス ライブラリのクラスの多くがパラメータ化されたコンストラクタを使用し、 パラメータ化されたコンストラクタを持たないクラスはパブリック インスタンス (Public Instance) のメンバをほとんど所有しないからです。

これらの制限事項により、 もっと興味深く、役立つオプションに話題を移します。 このオプションとは、.NET から Office VBA オブジェクト ライブラリと ActiveX コントロールを呼び出すことです。

Visual Basic .NET から VBA オブジェクト ライブラリを呼び出す

Office ソリューション開発で新しい、優れた機能は、 .NET アプリケーションから Office VBA オブジェクト ライブラリの機能を統合することです。 これを行う方法について、 Microsoft Visual Basic .NET、Visual Studio .NET のメンバ、および Visual Basic 言語の革新的な機能を使って示していきます。 Visual Basic .NET は、やや Office VBA に似ていますが、 いくつかの重要な違いがあります。 これについては、コードを示した後で説明するつもりです。

コンソール アプリケーションを使用して Outlook オブジェクト ライブラリを呼び出す

コンソール アプリケーションは、 複雑なユーザー インターフェイスのオーバーヘッドを必要としないソリューションに役立ちます。 一部の Microsoft Outlook® データについて報告する新しいコンソール アプリケーションを、 Visual Studio .NET を使って作成することによって、これを示してみましょう。

  1. [ファイル] メニューをクリックして [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [プロジェクトの種類] ペインで、[Visual Basic プロジェクト] をクリックします。

  3. [テンプレート] ペインで、[コンソール アプリケーション] をクリックします。

  4. [プロジェクト名] ボックスに「olquery」と入力します。

  5. [場所] ボックスに簡単に覚えられる場所を入力し、[OK] をクリックします。

  6. [プロジェクト] メニューをクリックし、[参照の追加] をクリックします。

  7. [COM] タブで [Microsoft Outlook 10.0 Object Library] をクリックし (Microsoft Outlook 2002 がコンピュータにインストール済みであることを前提にしています)、 [選択] をクリックし、[OK] をクリックします。

  8. "...ラッパーを生成しますか?" というメッセージが表示されたら、[はい] をクリックします。 Outlook オブジェクト ライブラリは別のオブジェクト ライブラリを参照するので、 Visual Studio .NET はそれらのオブジェクト ライブラリにも同様に CCW アセンブリを作成します。 したがって、Microsoft Windows® エクスプローラを使用すると、 アプリケーションのソリューション フォルダの \bin フォルダに 2 つの CCW アセンブリ、 Interop.Outlook.dll (Outlook オブジェクト ライブラリを表す) と Interop.Office.dll (Microsoft Office 10.0 オブジェクト ライブラリを表す)、 が見つかるはずです。 これで、すべての .NET クラス ライブラリと同様にこれらのライブラリの機能を呼び出すことができるようになります。

  9. Module1.vb ファイルのコードを編集して、以下のようなコードにします。

    
    Imports Outlook.OlDefaultFolders
    Imports Microsoft.VisualBasic.ControlChars
    
    Module Module1
    
        Sub Main()
    
            Dim objApp As Outlook.Application
            Dim objNameSpace As Outlook.NameSpace
            Dim objMAPIFolder As Outlook.MAPIFolder
            Dim objSubFolder As Outlook.MAPIFolder
            Dim strFolder As String
            Dim strAgain As String
            Dim intFolderEnum As Integer
            Dim lngItemCount As Long
            Dim lngAppointmentCount As Long
            Dim lngContactCount As Long
            Dim lngDistListCount As Long
            Dim lngJournalCount As Long
            Dim lngMailCount As Long
            Dim lngNoteCount As Long
            Dim lngPostCount As Long
            Dim lngTaskCount As Long
            Dim lngOtherCount As Long
    
            objApp = New Outlook.Application()
            objNameSpace = objApp.GetNamespace(Type:="MAPI")
    
            Do
                ' 前のループからのカウンタをリセットします。
                lngItemCount = 0
                lngAppointmentCount = 0
                lngContactCount = 0
                lngDistListCount = 0
                lngJournalCount = 0
                lngMailCount = 0
                lngNoteCount = 0
                lngPostCount = 0
                lngTaskCount = 0
                lngOtherCount = 0
    
                Console.Write("Outlook フォルダ名 : ")
                strFolder = Console.ReadLine()
    
                ' ユーザーのエントリを OlDefaultFolders 定数にマップします。
                Select Case strFolder
                    Case "削除済みアイテム"
                        intFolderEnum = 3
                    Case "送信トレイ"
                        intFolderEnum = 4
                    Case "送信済みアイテム"
                        intFolderEnum = 5
                    Case "受信トレイ"
                        intFolderEnum = 6
                    Case "予定表"
                        intFolderEnum = 9
                    Case "連絡先"
                        intFolderEnum = 10
                    Case "履歴"
                        intFolderEnum = 11
                    Case "メモ"
                        intFolderEnum = 12
                    Case "仕事"
                        intFolderEnum = 13
                    Case "下書き"
                        intFolderEnum = 16
                    Case Else
                        Console.Write("'" & strFolder & "'" & _
                            "は有効なフォルダではありません。 " & _
                            "有効なフォルダは予定表、" & _
                            "連絡先、削除済みアイテム、" & _
                            "下書き、受信トレイ、履歴、メモ、" & _
                            "送信トレイ、送信済みアイテム、" & _
                            "および仕事です。いずれかのキーを押すと終了します...")
                        Console.Read()
                        Exit Sub
                End Select
    
                objMAPIFolder = _
                    objNameSpace.GetDefaultFolder(FolderType:=intFolderEnum)
    
                Console.Write("フォルダのコンテンツを計算しています..." & CrLf)
    
                ' フォルダ内の各項目を調査します。
                ' カウンタを適切にインクリメントし、続行します。
                For lngItemCount = 1 To objMAPIFolder.Items.Count
                    Select Case _
                            TypeName(VarName:=objMAPIFolder.Items.Item(lngItemCount))
                        Case "AppointmentItem"
                            lngAppointmentCount = lngAppointmentCount + 1
                        Case "ContactItem"
                            lngContactCount = lngContactCount + 1
                        Case "DistributionListItem"
                            lngDistListCount = lngDistListCount + 1
                        Case "JournalItem"
                            lngJournalCount = lngJournalCount + 1
                        Case "MailItem"
                            lngMailCount = lngMailCount + 1
                        Case "NoteItem"
                            lngNoteCount = lngNoteCount + 1
                        Case "PostItem"
                            lngPostCount = lngPostCount + 1
                        Case "TaskItem"
                            lngTaskCount = lngTaskCount + 1
                        Case Else
                            lngOtherCount = lngOtherCount + 1
                    End Select
                Next lngItemCount
    
                '項目の結果を報告します。
                Console.Write("このフォルダの合計項目数 : " & _
                    objMAPIFolder.Items.Count & CrLf & _
                    "予定: " & lngAppointmentCount & CrLf & _
                    "連絡先: " & lngContactCount & CrLf & _
                    "配布リスト: " & lngDistListCount & CrLf & _
                    "履歴項目: " & lngJournalCount & CrLf & _
                    "E-Mail メッセージ: " & lngMailCount & CrLf & _
                    "メモ: " & lngNoteCount & CrLf & _
                    "投稿: " & lngPostCount & CrLf & _
                    "仕事: " & lngTaskCount & CrLf & _
                    "その他の項目 : " & lngOtherCount & CrLf)
    
                Console.Write("再試行しますか ? (y/n): ")
                strAgain = Console.ReadLine().ToString
    
            Loop While strAgain = "y"
    
        End Sub
    
    End Module
    
  10. このサンプル コードを実行するには、 [デバッグ] メニューの [開始] をクリックします (または F5 キーを押します)。 図 4 は完了したコンソール アプリケーションを示しています。

Dd313957.office11012001-fig4(ja-jp,MSDN.10).gif

図 4. olquery.exe コンソール アプリケーション

以下は、コードがどのように機能するかを示しています。

  • Imports ステートメントは、 .NET 名前空間の完全修飾参照を記述するのを省略するために必要です。 Office VBA で Office.Outlook.Application のように記述することで Application オブジェクトを使用していることを識別するのと同じように、 Visual Basic .NET では Imports Outlook.OlDefaultFolders と記述することで、 Outlook.OlDefaultFolders.olFolderInbox と入力するところを、 olFolderInbox と入力するだけで済むようにします。
  • Module...End Module ステートメントは、 モジュールのインスタンスを定義します。 この場合は、Module1 です。 Visual Basic .NET で興味深い点は、 クラス モジュールやコード モジュールなどを含め、 コンソール アプリケーション全体を 1 つの .vb ファイルに詰め込むことができることです。 Module...End Module ステートメントは、 クラスのコードをファイル内の他のコード コンポーネントから切り離します。
  • Sub Main は、 このアプリケーションの Main サブルーチンです。 コンソール アプリケーションでは、プログラムの実行は Main サブルーチンから始まる必要があります。
  • Console.Write メソッドは、 情報を出力するという点で Office VBA の Debug.Print メソッドに似ています。 この場合は、コマンド プロンプトに出力します。 Console.Read メソッドは、 コマンド プロンプトでユーザーからの情報を取得できるという点で Office VBA InputBox 関数に似ています。
  • コードの残りの部分は、Outlook 開発者には非常に簡単です。 注意すべき 1 つの点は、MAPIFolder オブジェクトの Items プロパティが、 Items コレクションではなく Items オブジェクトを返すということです (Outlook には Items コレクションはありません)。 そのため、Items オブジェクトはコレクションのように扱われる .NET IEnumerable インターフェイスをサポートしないので、 使い慣れた For Each objItem In objMAPIFolder.Items を使用するのではなく、 インデックス番号ごとに Outlook の項目を反復処理する必要があります。
  • 記事のスペースの都合上、 このソリューションではエラー処理コードを使用していません。 エラー処理コードの作成方法の詳細については、次のセクションをご覧ください。

これは単純な例ですが、 コンソール アプリケーションが Office ソリューションに機能と柔軟性を追加できる方法を簡単に理解できます。 たとえば、コントロール パネルの [タスク] プログラムを使って、 定期的なスケジュールで実行される Office の自動実行アプリケーションを作成できます。 また、アプリケーション間にまたがる Office のマクロ、 洗練されたユーザー インターフェイスを必要としないアプリケーションなども記述できます。

Windows Forms アプリケーションを使用して Word オブジェクト ライブラリを呼び出す

さて、ここからは Visual Studio .NET の Windows Forms をご紹介しましょう。 これは、VBA UserForms に似ています。 以下は、Microsoft Word の一部の文書プロパティについて報告する新しい Windows Forms アプリケーションを Visual Studio .NET で作成する方法を示しています。

  1. [ファイル] メニューをクリックして [新規作成] をポイントし、[プロジェクト] をクリックします。
  2. [プロジェクトの種類] ペインで、[Visual Basic プロジェクト] をクリックします。
  3. [テンプレート] ペインで、[Windows アプリケーション] をクリックします。
  4. [プロジェクト名] ボックスと [場所] ボックスに情報を入力し、[OK] をクリックします。
  5. [プロジェクト] メニューをクリックし、[参照の追加] をクリックします。
  6. [COM] タブで [Microsoft Word 10.0 Object Library] をクリックし (Word 2002 がコンピュータにインストール済みであることを前提にしています)、[選択]、[OK] を順にクリックします。
  7. "...ラッパーを生成しますか?" というメッセージが表示されたら、[はい] をクリックします。
  8. [表示] メニューをクリックし、 [ツールボックス] をクリックします。 [Windows フォーム] タブで Button コントロールと OpenFileDialog コントロールをダブルクリックして、 ボタンと [ファイルを開く] ダイアログ ボックスを Form1 に追加します。
  9. [OpenFileDialog1] アイコンを右クリックして、[プロパティ] をクリックします。
  10. [Filter] ボックスに「Microsoft Word Documents (*.doc)|*.doc」と入力します。
  11. [Title] ボックスに「Select Word Document」と入力します。
  12. Button1 をダブルクリックします。フォームのコード ウィンドウが表示されます。
  13. コード ウィンドウのコードを以下のコードと一致するように編集します。
  14. このサンプル コードを実行するために、[デバッグ] メニューをクリックし、[開始] をクリックします。
  15. Form1 の Button1 をクリックし、 ローカル ファイル システムから Word 文書を選択します (Visual Studio .NET の出力ウィンドウで参照するには、CTRL+ALT+O を押します)。 図 5 は、完成したアプリケーションがどのように見えるかを示しています。

Dd313957.office11012001-fig5-thumb(ja-jp,MSDN.10).gif

図 5. 動作中の Windows Forms アプリケーション

以下は、選択した Word 文書を開き、その文書のプロパティについて報告するためのコードです。

                  
Imports Microsoft.VisualBasic.ControlChars
Imports System.Runtime.InteropServices
Imports Word.WdBuiltInProperty

Public Class Form1
    Inherits System.Windows.Forms.Form

' Windows フォーム デザイナによって生成されたコード

    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

        Dim strFileName As String
        Dim wdApp As New Word.Application()
        Dim objDoc As Word.Document

        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            Try
                strFileName = OpenFileDialog1.FileName
                objDoc = wdApp.Documents.Open(FileName:=strFileName)

                With objDoc
                    ' メッセージ ボックスに情報を出力します。
                    MessageBox.Show(Text:="タイトル: " & _
                        .BuiltInDocumentProperties(wdPropertyTitle).value & _
                        CrLf & "作成者: " & _
                        .BuiltInDocumentProperties(wdPropertyAuthor).value & _
                        CrLf & _
                        .BuiltInDocumentProperties(wdPropertyPages).value & _
                        " ページ。")

                    ' 出力ウィンドウに情報を出力します。
                    Console.Write(Format:="ファイル " & _
                        strFileName & "の内容 :" & CrLf)
                    Console.Write(Format:=.Content.Text)
                End With

            Catch ex As COMException
                ' "ファイルが見つかりません" エラー。
                MessageBox.Show(Text:="以下のファイルが見つかりません '" & _
                    strFileName & "'。再試行してください。")
            End Try

        End If

    End Sub

End Class

以下は、コードがどのように機能するかを示しています。

  • Imports ステートメントを使用して、 Imports Word.wdBuiltInProperty と記述すると、 その後 Word.wdBuiltInProperty.wdPropertyAuthor と入力する代わりに、 wdPropertyAuthor と入力できます。
  • Class...End Class ステートメントは、 クラスのインスタンスを定義します。この場合は Windows Form です。 Class...End Class ステートメントは、クラスのコードをファイル内の他のコード コンポーネントから切り離します。
  • Inherits ステートメントは、 Form1 が汎用の Windows Form を継承すること、 または汎用の Windows Form の動作や特性を採用することを示します。 この結果、最上部にフォームのキャプション、左上隅のアイコン、右上隅に最小化、最大化、閉じるボタンなどを含むことになります。
  • この例で Windows フォーム デザイナが生成したコードを表示または変更する必要はありません。
  • Sub Click...End Sub ステートメントは、 イベントとして VBA プログラマには馴染みがあります。 しかし、このイベントは Button1.Click メソッドを処理することを委任 (デリゲート) されているので、 .NET の用語では "デリゲート" として知られています。 Form1 で Button1 をクリックすると、このイベント内のコードが実行されます。
  • Try...Catch ステートメントは、 よく知られている VBA On Error GoTo ステートメントの新しいバージョンです (必要に応じて On Error GoTo を使用することもできますが、 .NET で等価なものを使い始めるべきです)。 Try...Catch を使用するには、 エラーが発生する可能性があるすべてのコードを Try ブロックで囲み、 Catch ブロックですべてのエラーを処理します。 複数の Catch ブロックを保持でき、 それらは Office VBA の Select Case Err.Number の構造の Case ステートメントに似ています。 さらに、Finally ブロックを追加してすべてのクリーンアップ動作を実行できます (Office VBA の標準のエラー処理コードの FunctionName_End 記法に似ています)。
  • Dim ステートメントは "イニシャライザ" の概念を導入しています。 Visual Basic .NET では、1 行のコードですべての変数を宣言できます。 Set キーワードは使用しなくなりました (このキーワードは使用できなくなりました)。
  • MessaeBox.Show メソッドは Office VBA MsgBox 関数に代わるものです (必要に応じて MsgBox 関数も使用できますが、.NET で等価なものを使い始めるべきです)。 この場合、MessageBox.Show メソッドは文書のタイトル、作成者、およびページ数を表示します。 CrLf 列挙定数は、Office VBA vbCrLf 列挙定数に代わるものです (必要に応じて vbCrLf 列挙定数を使用できますが、.NET で等価なものを使い始めるべきです)。
  • Console.Write メソッドは VBA Debug.Print メソッドに代わるものです (Debug.Print メソッドは Visual Basic .NET では利用できなくなりました)。 この場合、Console.Write メソッドは [出力] ウィンドウに文書の内容を表示します。

Visual Studio .NET に以下を含めたいくつかの変更点があることにお気づきになったでしょう。

  • 既定の開発環境の動作は、 一般的な Visual Studio 開発者のためのものです。 たとえば、オブジェクト ブラウザを表示するための既定のショートカット キーの組み合わせは、CTRL+ALT+J です。 また、ステップ イン操作の既定のショートカット キーの組み合わせは F11 です。 F2 キーとオブジェクト ブラウザを関連付け、 F8 キーをステップ イン アクションに関連付けるには、 [スタート ページ] タブをクリックして [マイ プロフィール] リストをクリックし、 [プロフィール] リストの [Visual Basic 開発者] をクリックします。
  • イミディエイト ウィンドウはありません。 コマンド ウィンドウ ([表示] メニューの [その他のウィンドウ] をポイントして [コマンド ウィンドウ] をクリック) が、 イミディエイト モードを提供します。 そのため、イミディエイト ウィンドウで操作を実行するコマンドを発行できます (イミディエイト モードにするには > プロンプトで immed と入力し、 コマンド モードに再度切り替えるには、 イミディエイト モードで >cmd と入力します)。 コマンド モードでは、メニューを使用せずに Visual Studio .NET に直接コマンドを送信できます。 たとえば、さまざまな Help コマンドを公開するには、 コマンド ウィンドウで「Help」と入力します。 また、[出力] ウィンドウ ([表示] メニューの [その他のウィンドウ] をポイントして [出力] をクリック) は、 Debug.Print ステートメントを使用してイミディエイト ウィンドウで処理していたような情報を出力するために使用されます。
  • ソリューション ファイル (.sln) が Visual Basic プロジェクト グループ ファイル (.vbg) の代わりに使用されます。 1 つのソリューションに 1 つ以上のプロジェクト (.proj) ファイルが含まれている場合があり、 それらが Visual Basic プロジェクト ファイル (.vbp) の代わりに使用されます。 すべての Visual Basic コード ファイルが .vb ファイル内に含まれます。
  • 一部の Office オブジェクトはインターフェイスに変換され、 一部の Office イベントはデリゲートに変換されます。 これは、これらのオブジェクトとイベントを使用する機能を変更することはありません。 Visual Studio .NET オブジェクト ブラウザ内で、 参照されているインターフェイスやデリゲートを個別に表示できるだけです。

.NET ソリューションに ActiveX コントロールを使用する

.NET フォームに Office ActiveX コントロールを埋め込みたい場面がたくさんあると思います。 Microsoft Outlook ビュー コントロールのインスタンスを既存の Windows アプリケーションに追加することで、 これを示してみましょう (これは、Microsoft Outlook ビュー コントロールがコンピュータにインストールされていることを前提にしています)。

  1. 上記のセクションの Windows アプリケーションを開き、 フォーム デザイナが表示されている状態で、 ツールボックス上で右クリックして [ツールボックスのカスタマイズ] をクリックします。

  2. [COM コンポーネント] タブで、 [Microsoft Outlook ビュー コントロール] の隣りにあるチェック ボックスをオンにして [OK] をクリックします。

  3. ツールボックスの [OVCtl] アイコンをクリックし、 マウスを使って Form1 に Outlook ビュー コントロールのインスタンスを描画します。

  4. [デバッグ] メニューの [開始] をクリックして、アプリケーションを実行します。

    **注意   ** .NET で ActiveX コントロールの機能を呼び出すには、 Visual Studio .NET が生成するコントロール名 (この場合は AxViewCtl1) を知っておく必要があることに注意してください。 もちろん、このフォームの名前をフォーム デザイナの [プロパティ] ウィンドウから変更することもできます。

.NET ソリューションのパッケージ化と配布

単純なクライアント ベースのソリューションをパッケージ化および配布するには、 ソリューションのアプリケーション フォルダの \bin ディレクトリに存在するファイルをファイルの共有またはソース メディアにコピーします。 ユーザーがこれらのファイルをユーザーのコンピュータの単一のローカル フォルダにコピーして貼り付けるだけで、 アプリケーションの .exe ファイルを実行できます。 単純な Web アプリケーションについては、ユーザーにアプリケーションのルート .aspx ファイルへのパスを提供します。

ただし、ファイルを特定のフォルダにインストールし、 グローバル アセンブリ キャッシュにアセンブリを登録し、 ユーザーの [プログラム] メニューまたはデスクトップにエントリを配置し、 COM DLL を登録するといった特別なセットアップ オプションを実行したい場合は、 Visual Studio .NET で .NET セットアップと配布プロジェクトを作成する必要があります。 これを行うには、以下の手順に従ってください。

  1. 対象のソリューションを開き、 [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  2. [プロジェクトの種類] ペインで [セットアップ/デプロイメント プロジェクト] をクリックします。
  3. [テンプレート] ペインで [セットアップ ウィザード] をクリックします。
  4. [プロジェクト名] ボックスの下にある [ソリューションに追加] をオンにし、[OK] をクリックします。
  5. セットアップ ウィザードで手順を完了します。 たとえば、単純な Windows Forms アプリケーションに対しては、 [Windows アプリケーションのセットアップを作成する] (手順 2/5)、 [ProjectName のプライマリ出力] と [ProjectName のコンテンツ ファイル] (手順 3/5) 以外は既定の設定のままにできます。
  6. [ビルド] メニューの [SetupProjectName のビルド] をクリックします。
  7. 完了したら、 セットアップ プロジェクトのアプリケーション フォルダの \Debug または \Release フォルダのいずれかに SetupProjectName.msi という名前のファイルが存在するはずです。
  8. この単一の SetupProjectName.msi ファイルをユーザーに配布します。 ユーザーはローカル コンピュータで .msi ファイルを開くだけです。

ファイルをユーザーのファイル システムに追加、 レジストリ エントリを追加、ファイルの種類を追加、 ユーザーのインストール経験による外観の変更、 またはカスタム アクションを追加など、 インストール中に条件を設定させるには、 .msi ファイルに情報を追加してから .msi ファイルを再構築する必要があります。 セットアップ ソリューションを開き、 [ソリューション エクスプローラ] ウィンドウでセットアップ ソリューションを右クリックし、 [表示] をポイントし、 適切なメニュー コマンドをクリックし、 画面上の指示 (図 6 を参照) に従います。 その後、[ビルド] メニューの [SetupProjectName のリビルド] をクリックして、 新しい SetupProjectName.msi ファイルを作成します。

Dd313957.office11012001-fig6-thumb(ja-jp,MSDN.10).gif

図 6. Visual Studio .NET セットアップ プロジェクトを変更して、 インストール時にユーザーのファイル システムに追加されるファイルを編集する

詳細情報

一般的な .NET トピック

Office と .NET の相互運用性

Visual Studio .NET

Visual Basic .NET

COM と .NET の相互運用性

  • .NET Interop: Get Ready for Microsoft .NET by Using Wrappers to Interact with COM-based Applications (技術文書) (英語)

.NET アプリケーションのセットアップと配布

  • .NET Framework Deployment Basics (技術文書) (英語)
  • Deployment Scenarios (技術文書) (英語)

いつものように、Office ソリューション開発に関する情報と技術文書については、 Office Developer Center を定期的にチェックしてください。

 

Paul Cornell は、MSDN Online Office Developer Center および Office 開発者ドキュメント チームで働いています。 彼は暇な時間を彼の妻と 1 歳半になる娘と一緒に過ごしています。