わいえむねっと

Contents
Categories
Calendar
2010/03
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.052 sec
Chashed: -
2010/03/14 Sun
熱は下がった気がする。 VBとC#の遅延バインディングの違いについてにゃんにゃん言っている人がいたので、

Visual Basic .NET による Office オートメーション サーバーでのバインディング
http://support.mi​crosoft.co​m/default.as​px?scid=kb;JA;304661

Visual C# .NET で Office オートメーション サーバーをバインドする方法
http://support.mi​crosoft.co​m/default.as​px?scid=kb;JA;302902

をぼけと眺めてみる。

Visual Basic .NET では、IDispatch::GetIDsOfNames メソッドを使用して、そのオブジェクトでサポートされているメソッドおよびプロパティを確認し、IDispatch::Invoke メソッドを使用して、それらのメソッドやプロパティを呼び出すことができます。

Visual C# では、IDispatch::GetIDsOfNames メソッドを使用して、そのオブジェクトでサポートされているメソッドおよびプロパティを確認し、IDispatch::Invoke メソッドを使用して、それらのメソッドやプロパティを呼び出すことができます。

書いてあることは変わらんなーと思いつつサンプルコードを見てみたら全然違ってて噴いた。
以下、サンプルコード抜粋。

Visual Basic .NET 事前バインディング
Dim objApp As Excel.Application
Dim objBooks As Excel.Workbooks

objApp = New Excel.Application()
objBooks = objApp.Workbooks

Visual Basic .NET 遅延バインディング
Dim objApp As Object
Dim objBooks As Object

objApp = CreateObject("Excel.Application")
objBooks = objApp.Workbooks

Visual C# .NET 事前バインディング
Excel.Application objApp;
Excel.Workbooks objBooks;

objApp = new Excel.Application();
objBooks = objApp.Workbooks;

Visual C# .NET 遅延バインディング
object objApp_Late;
object objBooks_Late;

Type objClassType; 
objClassType = Type.GetTypeFromProgID("Excel.Application"); 
objApp_Late = Activator.CreateInstance(objClassType);
objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks", BindingFlags.GetProperty, null, objApp_Late, null );

ああ、これは確かに面倒だ。

ただやっぱり、

このような遅延バインディングには、事前バインディングでは避けられないバージョン依存関係を部分的に回避できるという利点があります。

が必要になる場面はあるわけで、さりとて

ただし、オートメーション コードの完全性をコンパイル時にチェックできなくなり、メソッドやプロパティの適切な呼び出しを支援する Intellisense 機能が提供されないという欠点もあります。

は嬉しくないわけで。
ままならない。