ExcelのRTD用DCOMサーバの作り方 続き

ExcelのRTD用DCOMサーバの作り方 - しがないプログラマ の日記
とりあえず実装方法は分かってから、上記の実装にたどり着くまでにいくつか問題がありました。

一番大きかったのが、.NETとCOMのマーシャリングを.NET自体が勝手にやってくれるのですがいくつかの型ではそれが期待したものと違うことになってしまい、しばらくはまっていました。今回は、System.Array型が IRtdServerインターフェイスに登場するのですが、VB側では Variant型の配列で扱いたい。Office PIAでは逆向きの変換を行ってくれていたので、.NETのCOM連携で逆向きの変換も行ってくれると思い込んでいたのが敗因でした。
配列に対する既定のマーシャリング | Microsoft Docs
結論から言うと前述のソースにも書いてありましたが、[MarshalAs(UnmanagedType.SafeArray)]とアノテーションが必要とのことです。MSのドキュメントは目的志向での検索がさっぱりなので、ここにたどり着くのにしばらくかかりました。

もう一つの問題は、DCOMとして独自のプロセスで動作させるのですが、メインが .NET側なので C#GUIを用意してそれをVBのEntryPointから起動できるように変更する必要がありました。そのため、公開クラスに起動メソッドを用意してあげなくてはなりませんでした。

それと、各 .NETのexeと ActiveX.exeをそれぞれレジストリに登録する必要があるので、.NETのregasmコマンドと、ActiveX.exe自体の /RegServerオプションを両方実行する必要があり面倒ですね。


そんなこんなで、なんとか動かすことができました。VB6は凄い久しぶりに触ったので文法を忘れててしばらくはまったりしましたが、COMを作るのには便利なToolです。
あとは、Excelが早くCOMを脱却して .NETの世界に移行してくれればこんな苦労をしなくて済んだのにと思いつつ、しばらく無理だろうなと。色々と忘れかけてた Windows Nativeな知識をフル稼働した1週間でした。