質問
私の質問は: C# は遅延バインディング IDispatch をネイティブにサポートしていますか?
顧客がインストールしたバージョンと互換性を保ちながら、Office を自動化しようとしているふりをします。
.NET の世界では、Office 2000 をインストールして開発した場合、すべての開発者とすべての顧客は、現在から最後まで Office 2000 を使用する必要があります。
.NET 以前の世界では、COMを使用して Office アプリケーションと通信していました。
例えば:
1) バージョンに依存しない ProgID を使用する
"Excel.Application"
これは次のように解決されます。
clsid = {00024500-0000-0000-C000-000000000046}
次に、COM を使用して、これらのクラスの 1 つをオブジェクトにインスタンス化するように要求します。
IUnknown unk;
CoCreateInstance(
clsid,
null,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IUnknown,
out unk);
そして今、私たちは競争に出かけています - アプリケーション内から Excel を使用できるようになりました。もちろん、本当にオブジェクトを使用したい場合は、何らかの方法でメソッドを呼び出す必要があります。
私たちの言語に翻訳されたさまざまなインターフェース宣言を手に入れることができました。このテクニックは優れています。
- 早期バインディング
- コードインサイト
- コンパイル型の構文チェック
いくつかのコード例は次のとおりです。
Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;
しかし、インターフェイスを使用することには欠点があります。言語に変換されたさまざまなインターフェイス宣言を把握する必要があります。そして、すべてのパラメーターを指定する必要があるメソッドベースの呼び出しの使用に行き詰まっています。
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);
これには、現実の世界で、喜んであきらめるほどの欠点があることが証明されています。
- 早期バインディング
- コードインサイト
- コンパイル時の構文チェック
代わりにIDispatchレイト バインディングを使用します。
Variant xl = (IDispatch)unk;
Variant newWorksheet = xl.Worksheets.Add();
Excel の自動化は VB スクリプト用に設計されているため、多くのパラメーターを省略することができます。パラメーターなしではオーバーロードがない場合でも省略できます。
注: Excel の例と、IDispatch を使用する理由を混同しないでください。すべての COM オブジェクトが Excel であるとは限りません。一部の COM オブジェクトは、IDispatch 以外ではサポートされていません。