C#からCOMに接続 CreateObjectとGetObject
C# からCOMオートメーションを使用していたら,いつもはCreateObjectに相当する操作しかしていなかったので,毎回アプリケーションが起動していたが,GetObjectを使用すればすでに起動しているものに接続できる.
C#からCOMオブジェクトを使用したい場合には,サンプルにCreateObjectというものが必ずと言っていいほどでてくる.
しかし,Createと言っているので毎回新しいインスタンスが作成される(アプリケーションが起動する).
いままでそういうものだと思っていたが,どうも違うらしい.
すでに起動したあアプリケーションに接続する方法があるらしい.
ただし,マイクロソフトのサイトに「ほとんどの場合、Office アプリケーションをオートメーションで実行するには CreateObject (Visual Basic) または CoCreateInstance (Visual C++) を使用して Office アプリケーションの新規インスタンスを起動する必要があります。」という仕様になっているという記事があり,万能ではない.
こんな感じ
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApp1 { public partial class Form1 : Form { private Excel.Application appExcel = null; private Excel.Workbook objWorkbook = null; private Excel.Worksheet objWorksheet = null; public Form1() { InitializeComponent(); try { this.appExcel = (Microsoft.Office.Interop.Excel.Application)Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application"); this.objWorkbook = this.appExcel.ActiveWorkbook; } catch (Exception) { this.appExcel = new Excel.Application(); this.appExcel.Visible = true; this.objWorkbook = this.appExcel.Workbooks.Add(); } this.objWorksheet = (Excel.Worksheet)this.objWorkbook.Sheets[1]; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (objWorksheet != null) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorksheet); } catch { } } /*if (objWorkbook != null) { try { objWorkbook.Close(true, Type.Missing, Type.Missing); } catch { } } if (appExcel != null) { try { appExcel.Quit(); } catch { } }*/ } private Int64 count = 0; private void button1_Click(object sender, EventArgs e) { this.objWorksheet.Range["A1"].Value = count++; } } }