.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 でやった方が楽なのかもしれないなあ。