RCWを介したCOMの呼び出し
プログラミングC# p597
上のリフレクションバージョンよりは、プログラミングがしやすい。その代わり手順があります。
RCW(Runtime Callable Wrapper; ランタイム呼び出し可能ラッパー)っていうのは、.NETから直接COMオブジェクトを呼べないので、
.NETプログラム → RCW → COMオブジェクト
のように、.NETプログラムとCOMオブジェクトをつなぐものと考えればよいようです。
手順は以下の通り。
(1) Microsoft Visual C# 2008 Express Editionを起動する
(2) コンソールアプリケーションを作成する
(3) ソリューションエクスプローラの参照設定を右クリック → 参照の追加をクリック
(4) COMのタブを選択し、呼び出したいCOMのファイル名を調べる。
例えば、Microsoft Excel 9.0 Object Libraryならば、C:\Program Files\Microsoft Office\Office\EXCEL9.OLBなので、
「EXCEL9.OLB」がファイル名になります。
※1〜4はExcel(などのOfficeプログラム)を使っても可能。
(1) Excelを起動する
(2) Alt押しながらF11を押下し、Visual Basic Editorを起動する
(3) ツール → 参照設定
(4) 呼び出したいCOMのファイル名を調べる。
(5) tlbimpコマンドで、RCWを生成する。
こんな感じ。
>tlbimp EXCEL9.OLB /out:Excel.dll Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. Type library imported to C:\Excel.dll >
結果、Excel.dllというファイル名でRCWが生成されます。
(6) RCWを呼び出すプログラムを書いてみる。
using System; using Excel; class CallExcelTest { static void Main(string[] args) { Application excelObj = new Application(); Workbooks workbooksObj = excelObj.Workbooks; Workbook workbookObj = workbooksObj.Add(XlWBATemplate.xlWBATWork sheet); workbookObj.SaveAs("C:\\test.xls", -4143, "", "", false, false, XlSaveAsAccessMode.xlNoChange, 0, false, 932, 0); excelObj.Quit(); } }
(7) コンパイルする。
csc /r:Excel.dll CallExcel.cs
(8) 実行する。
この例の場合だと、C:\test.xlsが作成されます。
ちなみにVBScriptで同じことをやるとこんな感じ。
Set excelObj = CreateObject("Excel.Application") Set workbooksObj = excelObj.Workbooks Set workbookObj = workbooksObj.Add() workbookObj.SaveAs("C:\test.xls") excelObj.Quit()
特に上のような手順を踏まなくても、このスクリプトをテキストファイルとして保存してcscriptにかけてやれば、すぐに実行できます。
VBScriptの場合は引数省略できるのに、C#の場合できないのはなぜだろうか。。
そのせいで大分不便のような気がします。
→探したらすぐに見つかりました。
C# からメソッドに省略可能な引数を渡す方法
Type.Missingか、なるほどね。