.NET2.0 の場合、 IRunningTableObject を使用すれば良いようです。これは .NET2.0 から追加されたクラスで、それ以前の場合は UCOMIRunningTableObject になるようですが、使い方はたぶん、大体同じ。なので .NET1.0 でのサンプルでも、 UCOMxxx の UCOM を取っ払えば .NET2.0 に転用できます。
とりあえず登録は、こんな感じでできるようです。
class OLE32 { [DllImport("Ole32.Dll")] public static extern int CreateBindCtx( int reserved, out IBindCtx bindCtx); [DllImport("Ole32.Dll")] public static extern int CreateItemMoniker( [MarshalAs(UnmanagedType.LPWStr)] string lpszDelim, [MarshalAs(UnmanagedType.LPWStr)] string lpszItem, out IMoniker ppmk); } public partial class MainForm : Form { public MainForm() { InitializeComponent(); // ここから ---- IBindCtx bc; OLE32.CreateBindCtx(0, out bc); IRunningObjectTable tbl; bc.GetRunningObjectTable(out tbl); IMoniker moniker; OLE32.CreateItemMoniker("!", "hoge", out moniker); tbl.Register(0, this, moniker); // ---- ここまで } }
これをビルドして実行し、 ROT Viewer で見ると hoge が登録されます。ただ IRunningObjectTable::Register メソッドに渡す引数が正しいのかとか、そもそも ROT ってなんやねん状態なので色々怪しいので、あまり上記コードは信用しない方が良いと思われます。もうちょっと理解が進んだらまた書きます。
しかし思いのほか面倒です。 exe でなければとても簡単なのに……。これならまだ素直に VC + ATL でやった方が楽なのかもしれないなあ。