IronPython 2.0 における OLE Automationサポート

IronPython 2.0ベータには、COMのOLE AutomationをサポートするためのIDispatchサポートが含まれています。このサポートを有効化するのが、-X:PreferComDispatchスイッチなのですが、ShriさんのBlogによると何やら面白そうな機能を追加させるようです。ベータ1には含まれていないので、Change Set 32648で試してみました。Change Set 32648をダウンロードしてビルドして作成したipy.exeで試したのが以下のコードです。

 C:\Python\2.0\32648\IronPython_Main\Bin\Debug>ipy -X:PreferComDispatch
IronPython 2.0 Beta (2.0.0.1000) on .NET 2.0.50727.1434
Copyright (c) Microsoft Corporation. All rights reserved.
>>> import clr
>>> import System
>>> wordTLB = System.Guid("00020905-0000-0000-C000-000000000046")
>>> clr.AddReferenceToTypeLibrary(wordTLB)
>>> dir()
['System', '__builtins__', '__doc__', '__name__', 'clr', 'wordTLB']
>>> from Word import Application
>>> dir()
['Application', 'System', '__builtins__', '__doc__', '__name__', 'clr', 'wordTLB
']
>>> word = Application()
>>> word.Visible = True
>>> doc = word.Documents.Add()
>>> doc.Range().Text = "Hello from IronPython"
>>> word.Quit()

clrモジュールにAddReferenceToTypeLibraryメソッドが追加されていて、COMオブジェクトのGuidを渡します。そうするとAutomationオブジェクトをインポートできるようになります(from Word import Application)。後はインスタンスを作成して、操作をするだけという手軽さです。このコードで関心したのは、最後のQuitメソッドを呼んだ後のWordオブジェクトの扱いです。タスクマネージャで確認したら、winword.exeのプロセスも終了していました。つまり、Automationオブジェクトのプロセスのクリーンアップをちゃんとしてくれているということです。
#個人的には、何気にクリーンアップをちゃんとするので良いなぁと思ったりしています。

最後にChange Set 32648のソースコードを見ていて気がついたのですが、DLR関連のプロジェクトが、Microsoft.ScriptingとMicrosoft.Scripting.Coreの2つになっていました。ネームスペースは変更されていないのですが、内部構造の変更が行われているようです。