gpt4 book ai didi

windows-phone-8 - C# 和 C++/CX 对象有什么关系?

转载 作者:行者123 更新时间:2023-12-04 19:09:00 24 4
gpt4 key购买 nike

我有一个 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();

我有以下问题
  • CB com 是托管对象。那么 C++/CX 对象在哪里呢?我有
    听说 CB com 指向一些 C++/CX 对象(它们驻留在
    在 native 堆上),对吧?
  • 如果 CB com 由 .NET GC 释放,C++/CX 对象如何
    然后释放?
  • 当我通过 CB 到运行时组件, CB 属于托管
    还是 native 堆?
  • 在哪里字典 居住?谁来释放它?
  • 最佳答案

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

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

    所以解决你的问题:

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com