5

C# WP アプリケーションによって消費される WP C++ ランタイム コンポーネントがあります。

C++ ランタイム コンポーネントでは、

public interface class ICallback
    {
    public:
        virtual void DoSomething();
    };

public ref class WindowsPhoneRuntimeComponent sealed
    {
    public:
        WindowsPhoneRuntimeComponent();
        void SetCallback(ICallback ^callback);
        IMap<Platform::String^, Platform::Object^>^ CreateDictionary();

    };

C# アプリケーションでは CallbackImp、 を実装していますICallback。それから私はします

CallbackImp cb = new CallbackImp ();
WindowsPhoneRuntimeComponent com = new WindowsPhoneRuntimeComponent();

// Set callback
com.SetCallback(cb);

// Get dictionary
IDictionary<string, object> dict = com.CreateDictionary();

次の質問があります

  1. cbcomは管理対象オブジェクトです。では、C++/CX オブジェクトはどこにあるのでしょうか? cbcomがいくつかの C++/CX オブジェクト (ネイティブ ヒープ上にある) を指していると聞きましたよね?
  2. cbcomが .NET GC によって解放される場合、C++/CX オブジェクトはどのように解放されますか?
  3. cbをランタイム コンポーネントに渡す場合、 cbはマネージド ヒープまたはネイティブ ヒープのどちらに属しますか?
  4. dictはどこにありますか? 誰がそれを解放しますか?
4

1 に答える 1

6

一切の関係はございません。C++/CX は、WinRT 型との相互運用を容易にするように設計された純粋なアンマネージ言語拡張です。実際にはボンネットの下の COM 型です。構文はマネージ C++/CLI 言語によく似ています。これは主に、同じ問題を解決するように設計されており、アンマネージ型との相互運用を容易にするためです。

C# コードでも同様のことが起こります。あまり目立たないことですが、C# コンポーネントはマネージド型をアンマネージド WinRT 型として公開しています。CLR に組み込まれている言語プロジェクションを利用します。これにより、CLR に組み込まれている既存の COM 相互運用機能が利用されます。完全に見えないわけではありません。たとえば、C# クラスをsealedと宣言する必要があります。これは、実装の継承ではなくインターフェイスの継承のみをサポートする COM によってもたらされる制限です。また、DateTime の代わりに DateTimeOffset を使用する必要があるなど、その他のさまざまな情報があります。これは、DateTimeOffset のみをマッピングする言語射影の副作用です。など。

だからあなたの質問に対処する:

  1. ここには C++/CX オブジェクトはありません。これらは COM サーバーの実装の詳細です。WinRT オブジェクトを作成するための基本的な低レベル API は、COM の CoCreateInstance() 関数と同じ動物である RoCreateInstance() です。クラスファクトリを使用してオブジェクトを作成します。オブジェクトはサーバーによって所有され、通常の COM インターフェイス ポインター以外の他のコードにはまったく公開されません。
  2. メモリは COM で管理されるため、WinRT では参照カウントによって管理されます。IUnknown::AddRef() は参照を追加し、IUnknown::Release() は参照を解放します。最後の Release 呼び出しがカウントを 0 にデクリメントすると、サーバーはオブジェクトを破棄します。あなたの C++/CX リファレンスは範囲外です。COM コードで使用する CComPtr および _com_ptr_t ラッパー クラスとまったく同じ動作ですが、スマート ポインターを自分で作成する必要がなく、コンパイラーが処理するという違いがあります。これにより、CCW によって保持されている管理対象オブジェクトの参照が削除されるという詳細が追加されています。最終的には、GC が C# オブジェクトをガベージ コレクションできるようになります。
  3. cbオブジェクトはGC ヒープに存在します。前述のように、COM はインターフェイス ポインターのみを公開します。WinRT は、オブジェクトが実際に存在する場所に完全に依存しません。クラス ファクトリと IUnknown メソッドはその詳細を隠します
  4. 3と同じ。
于 2013-07-11T10:21:32.223 に答える