ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

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か、なるほどね。