コアが C++ で記述され、ActiveX と .Net シェルの両方を備えたコンポーネントを移植しています。コンポーネントは、多くの場所で VARIANT 型を内部的に使用します。このコンポーネントの引数の一部のパブリック プロパティ (get/set) とメソッドは、ActiveX 実装では VARIANT 型で、.Net 実装では System::Object 型です。コードの内部では、VARIANT を直接使用しています。
VARIANT は OLE/COM 型であるため、ActiveX コンポーネントを実装するときにマーシャリングを行う必要はありませんでした。
.Net コンポーネントを実装するときは、次のようなものを使用しました。
VARIANT var;
//...
//Initialize the VARIANT value
//...
System::IntPtr p( &var );
System::Object ^o = System::Runtime::InteropServices::Marshal::GetObjectForNativeVariant(p );
return o;
WinRT では、同じような Marshal クラスはないようです。MSDN によると、「WinRT Platform::Runtime::InteropServices 名前空間は内部使用のみを目的としており、開発での使用は意図されていません。」
私のオプションは何ですか?確かに、ABI の境界を越えて VARIANT をマーシャリングする作業を行う既存のクラスが存在する必要があります。私はそのようなマーシャラーを書きたくありません。
どんな助けでも大歓迎です。