Windows Runtime中的内存管理

4
根据我在“Windows 8 for .NET developers”会议上所看到的,.NET处理平台的本地对象。这些对象支持指针计数器。我明白了有托管对象和非托管对象,在托管堆上存在,并且需要在finalize和dispose方法中释放非托管对象。但目前我不清楚在Windows Runtime中应该如何处理内存管理问题。请问什么时候需要关注托管/非托管资源?以及Windows Runtime中的内存管理是如何工作的,以防止我的应用程序出现资源泄漏?
更新:
我的意思是.NET Metro Profile。
1个回答

4
底层的WinRT接口是基于COM的。每个WinRT接口都派生自IUnknown,它的AddRef和Release方法实现了基于引用计数的内存管理。
然而,在编写WinRT应用程序时,您使用语言投影来隐藏这些细节。对于.NET和Javascript应用程序,语言投影分别内置于CLR和Chakra引擎中。它们将WinRT接口映射到本地语言结构中,巧妙地营造出COM支持泛型和实现继承的假象。一个比较合理的猜测是CLR投影使用已经内置在CLR中的COM互操作支持,但很难逆向工程化。如果这一点准确无误,那么finalizer可能会调用IUnknown::Release()。
目前很难获取有关低级细节的合适信息,微软的博客作者和SO帖子作者并没有谈论,源代码也不可用,与此相关的问题正在被关闭,比如这个
正如陈的评论所示,你不应该对此感到好奇。如果您担心,考虑使用C++/CX进行编程。它很好地隐藏了胶水代码。或者使用WRL库的本机C++,它则没有。这两个运行时环境都需要显式进行内存管理。微软投入了大量资源使C++编程再次变得重要。

非常感谢您的回答。据我所知,C# 是专门为 .NET 设计的。那么 Metro 呢?这是否意味着如果我开始开发我的第一个 Metro 应用程序,最好选择 C++,或者我不需要关心投影?在 Windows Runtime 中是否存在已知的内存泄漏问题? - Access Denied
我已经阅读了上面提到的帖子,没有得出关于最佳投影的强烈意见。似乎它们都有优缺点。 - Access Denied
1
WinRT编程的一个重要方面(在开发周期相当晚期出现)是许多winrt对象现在支持ICloseable,这被投影到C#应用程序中作为IDisposable。这使得.Net和JS应用程序能够实现确定性终止。 - Larry Osterman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接