Officeソリューション開発時の開発環境のバージョン選定について

こんにちは Office 開発系サポートの森 健吾 (kenmori) です。 今回の投稿では .NET Framework 上で動作する Office ソリューションを開発する際に、検討すべき開発環境のバージョン選定のために必要となる情報について記載いたします。 以下の内容でご説明させていただきます。   2017/2 Update 新しい Visual Studio と Office バージョンについての記事を以下に投稿しました。 タイトル : [オートメーション / VSTO] .NET での Office ソリューション開発時の開発環境のバージョン選定 (2017 年 2 月版) アドレス : https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/02/07/office-development-environment-2017/    目次   1. 導入 – 開発環境に必要なもの   2. Officeオートメーションの場合   3. VSTO ソリューションの場合   4. 複数バージョンが混在インストールしている場合の動作について  …


Office オートメーションで割り当てたオブジェクトを解放する – Part2

こんにちは、Office 開発系サポート 森 健吾 (kenmori) です。 今回の投稿では、Office オートメーションの実装コードで割り当てたオブジェクトを解放する – Part1 の続編を記載いたします。続編では、前回の投稿でベスト プラクティスとして紹介した解放処理に対して解説を実施した後、正しくオブジェクト解放を実施しない場合に生じる影響についてご紹介します。 最初に、オブジェクト解放漏れがあると、主に以下のような事象があるということは先に述べておきます。 ・意図とは異なる COM オブジェクトに接続され、想定とは異なる結果を返し、アプリケーションの動作に予期せぬ影響を与えます。・通常のメソッド実行にも関わらず COMException 等の例外が返さることがあります。・イベント呼び出し時にフリーズすることがあります。・Office の内部処理 (例. 終了時の処理など) に予期せぬ影響を及ぼすことがあります。・解放漏れのオブジェクトがメモリを圧迫します。  オブジェクトの解放漏れと聞いて、誰もが最初に思いつくメモリ圧迫などのパフォーマンスへの影響以外にも実に様々な問題の要因となります。今回は、この投稿を読み終えた後、なぜそうなるかが理解できるようになることを目標とします。なお、幅広い読者層を想定して、可能な限りわかりやすい記述を心掛けます。そのため、なるべく簡略化した説明にするためにより一般的な内容だけにフォーカスし、細かな説明等は省いております。フィードバック等がありましたらお知らせください。 まずは、Part 1 で確認したベスト プラクティスのコードを分析しましょう。   1.    ベスト プラクティスのコードを分析する   1)     .NET における Interop COM オブジェクトの生成について New 演算子で Excel.Application クラス等を生成すると、RCW (ランタイム呼び出し可能ラッパー) も生成され COM オブジェクトのインスタンスを管理することになります。 注意点としては、RCW は COM オブジェクトとは別の形で参照カウントをカウントしている点になります。そのため、既存のアンマネージ COM オブジェクトに対して接続する際においては、独自の参照カウンタのみを増やし、既存オブジェクトを再利用する動作等に至ります。 タイトル : ランタイム呼び出し可能ラッパーアドレス :…


1. Office PIA 経由で Office 製品をオートメーションすることによる、Office オブジェクトモデルの操作

こんにちは、Office 開発系サポートの柴田 茂 (sshibata) です。本稿で表現している、Office オートメーションとは、Windows 上の全く別のアプリケーションを使用して、Office によって通常は手動やマクロによって行われる処理を、自動化する仕組みとなります。例えば、Excel のオートメーションを使用すれば、新規ブックの作成、ブックへのデータ入力、グラフの作成などの作業を自動的に実行させることができます。Excel などの Microsoft Office アプリケーションでは、通常はユーザー インターフェイスを介して手動で実行する機能のほぼすべてを、オートメーションによってプログラムから実行することができます。 Microsoft Office では、プライマリ相互運用機能アセンブリ (PIA) と呼ばれるライブラリが用意されており(以下Office PIA)、これを使用することで、Office アプリケーションによって公開されている COM オブジェクトを使ってOfficeを外部から操作するOffice ソリューションを開発することができます。 利用できるオブジェクトやメソッドの名前はほぼVBA と一緒であり、従来VBA マクロに限定されていたOffice 用のオブジェクトが、外部アプリケーションからアクセスできるインターフェースとして公開されているということになります。 このテクノロジを実装した場合の実行条件は、クライアント環境に、操作対象の Officeアプリケーションがインストールされていて、かつ対象バージョン以降の.NET Framework がインストールされていることと、Office PIA がGAC(グローバルアセンブリキャッシュ) に登録されていることになりますが、詳細については、次回以降に掘り下げたいと思います。 さて、Visual Studio にてアプリケーションを作成し、参照設定から、Office のタイプライブラリ経由で Office 製品のインスタンスを生成してコーディングを始めると、インテリセンス等でも確認できる通り、必要なオブジェクトを取得すれば、VBA と同じ感覚でプログラミングすることができます。 基本的には、Office アプリケーション上で、ユーザー インターフェイスを介して手動で実行する機能のほぼすべてを、実装することができます。 注意点としては、先日の森さんの投稿(Office オートメーションで割り当てたオブジェクトを解放する – Part1) のようなCOM オブジェクトを操作しているという意識を持って、オブジェクトを明示的に破棄するなどの処理を行ったり、イベントを適切に扱う等の考慮事項が発生します。さて、実際にOffice アプリケーションのイベントを扱うサンプルをご紹介しましょう。 今回制御したいのは、Excel ワークブックが閉じる直前に発生するWorkbookBeforeCloseイベントです。 AppEvents_Event.WorkbookBeforeClose イベントhttp://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.appevents_event.workbookbeforeclose(office.11).aspx VB.NET の場合には、WithEvents を使って変数を定義すると、VBA のイベント共有と同じように、WithEvents…


Microsoft Office 製品を Windows のプラットフォーム上で別アプリケーションから操作する場合のテクノロジについて

こんにちは、Office 開発系サポートの柴田 茂 (sshibata) です。私の投稿では、Microsoft Office 製品を、Windows のプラットフォーム上で別アプリケーションから操作する場合にどんなテクノロジを検討すべきかというテーマについて記載致します。 .NET Framework が登場するはるか前の時代から、Windows 上で動作するOffice アプリケーションに介入してアプリケーションソフト間でデータを転送・共有するための仕組みは存在していました。それが、OLE と呼ばれる規格(Object Linking and Embedding) であったり、DDE というテクノロジであったり(Dynamic Data Exchange)、ファイルを含めたデータソースへのアクセスを目的としたCOM のセットである、ActiveX Data Objects (ADO)であったりしました。 これらのテクノロジは、マイナーバージョンアップを繰り返しながら、あるいは、.NET Framework に対応できるようにインターフェースが内部的にラップされる等の経緯を経て進化を続けています。 さらに、Office 用のプライマリ相互運用機能アセンブリ (Office PIA) と呼ばれる Office オブジェクトを外部に公開したインターフェース経由でのデータアクセスや、Open XML 準拠のOffice ファイルに対するアクセスが登場してきているのが現在の状況です。そして、今後急速にCloud 化の大きなうねりに伴った新技術が公開されてくることでしょう。 ただし、全ての会社が最新の流行に乗って社内IT 環境を整えられるわけでもありませんし、今まで運用・作成してきた情報資産の有効活用も大きな課題となることは想像に難くありません。私も現在の仕事を通して、お客様(現場の担当者様)が色々と創意工夫をしながら、よりよいIT 環境を提供しようと日々模索していることに、大きな刺激を受けています。 前置きが少し長くなりましたが、私の連載においては、Office アプリケーションで作成されたファイルをコード上から操作するテクノロジについて整理する予定です。既にご存知の方も多いとは思いますが、Office を操作するためには、主に以下の技術を利用することができます。   1. Office PIA 経由で、Office 製品をオートメーションすることによる、Office オブジェクトモデルの操作   2. レイトバインディングによる、Office オブジェクトモデルの操作   3. OLEDB (Object Linking and…