正如我在面向 .NET 开发人员的 Windows 8 会话中看到的,.NET 处理平台的本机对象。这些对象支持指针计数器。我很清楚,托管堆中存在托管对象和非托管对象,我们必须在 finalize 和 dispose 方法中释放它们。至于现在我不清楚我应该如何处理 Windows 运行时中的内存管理。当我不得不担心托管/非托管资源时,您能给我一个建议吗?以及如何在 Windows 运行时中进行内存管理以防止我的应用程序资源泄漏?
升级版:
我的意思是 .NET Metro 配置文件
正如我在面向 .NET 开发人员的 Windows 8 会话中看到的,.NET 处理平台的本机对象。这些对象支持指针计数器。我很清楚,托管堆中存在托管对象和非托管对象,我们必须在 finalize 和 dispose 方法中释放它们。至于现在我不清楚我应该如何处理 Windows 运行时中的内存管理。当我不得不担心托管/非托管资源时,您能给我一个建议吗?以及如何在 Windows 运行时中进行内存管理以防止我的应用程序资源泄漏?
升级版:
我的意思是 .NET Metro 配置文件
底层 WinRT 接口是基于 COM 的。每个 WinRT 接口都派生自 IUnknown,其 AddRef 和 Release 方法实现基于引用计数的内存管理。
然而,这隐藏得非常好,当您编写 WinRT 应用程序时,您会使用语言投影。对于 .NET 和 Javascript 应用程序,语言投影分别内置于 CLR 和 Chakra 引擎中。这完全隐藏了实现细节,WinRT 接口映射到本地语言结构。包括巧妙地制造 COM 支持泛型和实现继承的错觉。一个有点合理的猜测是 CLR 投影使用了 CLR 中已经内置的 COM 互操作支持,但不可能轻松地对其进行逆向工程。如果这完全正确,那么终结器可能会进行 IUnknown::Release() 调用。
现在很难获得关于低级细节的体面信息,微软博主和 SO 海报不说话,源代码不可用,涉及该主题的问题正在关闭,比如这个。
从陈对这个问题的评论可以看出,你不应该对此感到好奇。如果您担心,请考虑使用 C++/CX 进行编程。这可以很好地隐藏胶水。或带有 WRL 库的本机 C++,但没有。内存管理是明确的两个运行时环境。Microsoft 投入了大量资源来使 C++ 编程再次相关。