CCW が取り出せない?

特定の COM Interface から別の COM Interface を取り出そうとすると NullReferenceException が発生する。Unmanaged Code で実装してみると問題なく取り出せるんだけど…。

// 参照設定によって tlbimp が作った
[Guid(...)]
public interface Ixxx
{
  void GetYYY(out Iyyy);
}

// 参照設定によって tlbimp が作った
[Guid(...)]
public interface Iyyy
{
  ...
}


// アプリケーションコード
Ixxx intfX = ...;

Iyyy intfY;
intfX.GetYYY(out intfY); // throw NullReferenceException

うーん、Ixxx がアレだからかも?とか思いつつ、ちょっと COM Interop について知識不足な気配があるので、適当に試してみる。

// 追加
[Guid(...)] // Ixxx と同じ GUID
public Ixxx_2
{
  void GetYYY([MarshalAs(UnmanagedType.IUnknown)] out object Iyyy);
}

// アプリケーションコード
Ixxx intfX = ...;

// 当然この QI() は成功する
Ixxx_2 intfX2 = intfX as Ixxx_2;

object intfY_obj;
intfX.GetYYY(out intfY_obj); 
// intfY_obj に System.__ComObject が取得できる

Iyyy intfY = intfY_obj as Iyyy;
// intfY == null、QI() に失敗した。

やはり、COM Interop 経由で自分で自分を参照する CCW を取得することはできないんだろうか。予定ではこの先でこの Iyyy のメソッドの引数に自分自身を RCW としてぶちこむつもりだったのだが。