2009年2月19日木曜日

.netアセンブリをCOMサーバとして登録する場合の注意

GUIDがあるんだから、同じ``名前空間.クラス名''のクラスでも問題ないと思ったら問題大有り。生成されるレジストリエントリは

[HKEY_CLASSES_ROOT\MyEffect]
@="WMPWPFTest.MyEffect"

[HKEY_CLASSES_ROOT\MyEffect\CLSID]
@="{F6ADD2D1-C4C0-4E4A-99DF-49AC5A90D23B}"

[HKEY_CLASSES_ROOT\CLSID\{F6ADD2D1-C4C0-4E4A-99DF-49AC5A90D23B}]
@="WMPWPFTest.MyEffect"

[HKEY_CLASSES_ROOT\CLSID\{F6ADD2D1-C4C0-4E4A-99DF-49AC5A90D23B}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="WMPWPFTest.MyEffect"
"Assembly"="WMPWPFTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/Ruke/Documents/Visual Studio 2008/Projects/WMPWPFTest/bin/Release/WMPWPFTest.dll"

[HKEY_CLASSES_ROOT\CLSID\{F6ADD2D1-C4C0-4E4A-99DF-49AC5A90D23B}\InprocServer32\1.0.0.0]
"Class"="WMPWPFTest.MyEffect"
"Assembly"="WMPWPFTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:/Users/Ruke/Documents/Visual Studio 2008/Projects/WMPWPFTest/bin/Release/WMPWPFTest.dll"

と、実際に登録されるのはmscoree.dllだ。こいつが.netアセンブリをロードし、マーシャリングをする仕組みになっているっぽい。そこで、たとえGUIDがちがくとも、同じ``名前空間.クラス名''のクラスを複数登録すると、一つのCOMクライアントからそれらを同時に参照する場合に問題が生じる。多分、厳密な名前とやらを付与しても変わらない(未実験)。

そういうわけで、前のエントリで公開したWMPの視覚エフェクトのスケルトンをいじる時は名前空間やクラス名を変えて、その上でクラスのGUIDも変えるというステップを踏みましょう。

0 件のコメント: