Windows phone 8 C和C++/CX对象相关? 我有一个WP C++运行时组件,它将被C语言的WP应用程序消耗。 在C++运行时组件中,我有< /P> 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(); };

Windows phone 8 C和C++/CX对象相关? 我有一个WP C++运行时组件,它将被C语言的WP应用程序消耗。 在C++运行时组件中,我有< /P> 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(); };,windows-phone-8,windows-runtime,native,managed,c++-cx,Windows Phone 8,Windows Runtime,Native,Managed,C++ Cx,我有以下问题 cb和com是托管对象。那么C++/CX对象在哪里呢?我已经 听说cb和com指向一些C++/CX对象(位于 在本机堆上),对吗 如果.NET GC发布了cb和com,那么C++/CX对象是如何发布的 那就放了 当我将cb传递给运行时组件时,cb是否属于托管组件 还是本机堆 dict居住在哪里?谁将发布它 没有任何关系。C++/CX是一种纯非托管语言扩展,旨在简化与WinRT类型的互操作。实际上是引擎盖下的COM类型。该语法与托管C++/CLI语言非常相似,主要是因为它们旨在解决相

我有以下问题

  • cbcom是托管对象。那么C++/CX对象在哪里呢?我已经 听说cbcom指向一些C++/CX对象(位于 在本机堆上),对吗
  • 如果.NET GC发布了cbcom,那么C++/CX对象是如何发布的 那就放了
  • 当我将cb传递给运行时组件时,cb是否属于托管组件 还是本机堆
  • dict居住在哪里?谁将发布它

  • 没有任何关系。C++/CX是一种纯非托管语言扩展,旨在简化与WinRT类型的互操作。实际上是引擎盖下的COM类型。该语法与托管C++/CLI语言非常相似,主要是因为它们旨在解决相同的问题,从而简化与非托管类型的互操作

    在您的C#代码中也会发生类似的情况。更不明显的是,您的C#组件将托管类型公开为非托管WinRT类型。利用CLR内置的语言投影。这反过来又利用了CLR中内置的现有COM互操作。它不是完全不可见的,例如,您必须将您的C#类声明为密封的,这是COM带来的限制,它只支持接口继承,而不支持实现继承。还有其他各种花边新闻,比如必须使用DateTimeOffset而不是DateTime,这是只映射DateTimeOffset的语言投影的副作用。等等

    因此,请回答您的问题:

  • 这里没有C++/CX对象,它们是COM服务器的实现细节。创建WinRT对象的底层底层api是RoCreateInstance(),与COM CoCreateInstance()函数相同。它使用类工厂来创建对象。该对象由服务器拥有,除了普通的COM接口指针之外,它根本不向其他代码公开
  • 内存通过引用计数在COM中进行管理,从而在WinRT中进行管理。IUnknown::AddRef()添加引用,IUnknown::Release()释放引用。当最后一次释放调用将计数减为0时,服务器将销毁该对象。AddRef()调用是在C++/CX代码中由ref new或object reference赋值语句自动生成的,当C++/CX引用超出范围时,编译器会自动生成Release()。与com代码中使用的CComPtr和_com_ptr_t包装器类的行为完全相同,但不同之处在于编译器会处理它,而不必自己创建智能指针。附加的细节是,这将删除CCW持有的托管对象引用。这最终允许GC对C#对象进行垃圾收集
  • cb对象存在于GC堆上。如上所述,COM只公开接口指针,WinRT完全不知道对象的实际位置。类工厂和IUnknown方法隐藏了该细节
  • 与3相同

  • 1.在C#中调用new WindowsPhoneRuntimeComponent()时,会调用WindowsPhoneRuntimeComponent的构造函数,因此本机堆中一定有C++/CX对象?另外,当我引用新的运行时组件项目时,我可以看到新创建的对象的地址,那么“对象归服务器所有”是什么意思呢。“当您的C++/CX引用超出范围时”是什么意思?我个人认为cb和com在托管堆中,因此GC将决定何时释放它们,这将导致释放C++/CX对象,也可以将您自己的心智模型放在如何工作上。然而,这不是一个非常准确的方法。您需要了解COM到grok WinRT类型。祝您好运。根据“WinRT类型在本机堆上创建,它们不是垃圾收集的。正如您所说,它们是ref计数的。每当C#或VB调用程序通过GC集合释放投影的.NET对象时,底层RT对象的ref计数就会减少。当ref计数达到0时,它的析构函数(如果有的话)如果类型是WinRT本身实现的类型,则“确定”。但你问的是你自己的课,我自己的课有什么不同?我的C++/CX对象不是在本机堆上创建的吗?
    CallbackImp cb = new CallbackImp ();
    WindowsPhoneRuntimeComponent com = new WindowsPhoneRuntimeComponent();
    
    // Set callback
    com.SetCallback(cb);
    
    // Get dictionary
    IDictionary<string, object> dict = com.CreateDictionary();