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++;
}
}
}

