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语言非常相似,主要是因为它们旨在解决相
没有任何关系。C++/CX是一种纯非托管语言扩展,旨在简化与WinRT类型的互操作。实际上是引擎盖下的COM类型。该语法与托管C++/CLI语言非常相似,主要是因为它们旨在解决相同的问题,从而简化与非托管类型的互操作 在您的C#代码中也会发生类似的情况。更不明显的是,您的C#组件将托管类型公开为非托管WinRT类型。利用CLR内置的语言投影。这反过来又利用了CLR中内置的现有COM互操作。它不是完全不可见的,例如,您必须将您的C#类声明为密封的,这是COM带来的限制,它只支持接口继承,而不支持实现继承。还有其他各种花边新闻,比如必须使用DateTimeOffset而不是DateTime,这是只映射DateTimeOffset的语言投影的副作用。等等 因此,请回答您的问题:
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();